А вы довольны памятью своей Linux системы?


    Ни для кого не секрет, что в Unix системах вся информация предоставляется в виде файлов.
    В Linux есть файл /proc/kcore, который является «алиасом» на физическую память системы.
    Мануалы говорят, что полная длина этого файла — это размер физической памяти (RAM) плюс 4KB, но повертев этот файл на разных системах я пришел к выводу, что размер файла равен размеру RAM + SWAP.
    Аналогично этому файлу можно использовать устройства /dev/mem или /dev/kmem, но взаимодействие с ними в данном топике я не буду рассматривать.

    Имея под рукой «слепок памяти», первое что захотелось проверить — можно ли использовать эту «память» для восстановления/получения паролей пользователей системы.
    Непечатные символы нам для этой задачи не пригодятся точно, т.к. в паролях мы их использовать все равно не можем/не будем, поэтому используя команду strings мы можем от них избавиться, перегнав /proc/kcore в текстовый файл:
    # strings /proc/kcore > /tmp/kdump

    Подсчитаем количество получившихся строк
    # wc -l /tmp/kdump
    4438050 (данная цифра была получена на системе с 3 гигабайтами оперативной памяти)

    при таком варианте запуска команды мы получаем очень много ненужных и неуникальных данных, добавим сортировку:
    # strings /proc/kcore | sort -u > /tmp/kdump.uniq
    # wc -l /tmp/kdump.uniq
    3330526

    Записей все равно много, давайте представим, что используемые пароли больше 6 символов — добавим ключик -n 6:
    # strings -n 6 /proc/kcore | sort -u > /tmp/kdump.uniq.6
    # wc -l /tmp/kdump.uniq.6
    674397

    Таким образом мы получили некий файл с некими данными, давайте попробуем его использовать в качестве словаря для программы john the ripper и посмотрим получится ли расшифровать пароли из файла /etc/shadow
    # john --wordlist=/tmp/kdump.uniq.6 /etc/shadow
    Loaded 5 password hashes with 5 different salts (FreeBSD MD5 [32/32])
    ....

    Если аккаунты активны и для входа использовались пароли, а не ключи, то есть шанс расшифровать /etc/shadow с нашим свеженьким словарем.Из 5 машин, на которых я тестировал данную методологию удалось расшифровать 3 неизвестных мне пароля.

    С помощью kcore можно получить много интересной информации, например обнаружение LKM руткитов или исполнение скрытых команд, предлагаю пообсуждать это в комментах ;)

    P.S. ради эксперимента был написан свой парсер kcore, который в качестве параметров принимает минимальную и максимальную длину возможных паролей, если кому-то интересно, то могу выложить.

    UPD: ниже исходник парсера, который был написан для тестов

    #include <stdio.h>
    #include <unistd.h>
    #include <ctype.h>
    void usage(char* argv0)
    {
      printf("Usage: %s [options] <filename>\n",argv0);
      printf("-m [MIN] minimal length of string (Default: 4)\n");
      printf("-M [MAX] maximal length of string (Default: 12)\n");
      printf("<filename> file that u want to dump\n");
      exit(1);
    }
    int main(int argc, char* argv[])
    {
      FILE *fp;
      int arg, i, binvalid;
      int MIN=4;
      int MAX=12;
      char pass[MAX+1],ch;
      char* filename;
      while((arg = getopt(argc, argv, "m:M:")) != EOF)
       {
      switch(arg)
       {
        case 'm' : MIN=atoi(optarg);
               break;
        case 'M' : MAX=atoi(optarg);
               break;
        default : usage(argv[0]);
               break;
       }
       }
      if(optind >= argc)
       {
      usage(argv[0]);
       }
      filename = argv[optind];
      fp=fopen(filename,"r");
      if(!fp)
       {
      printf("ERROR: Unable open file: %s\n",filename);
      return 1;
       }
      i=0;
      do
       {
      ch=(char)fgetc(fp);
      if(feof(fp)) break;
      if( ch>33 && ch < 127 )
       {
         i++;
         pass[i-1]=ch;
         if(i>= MAX)
          {
         pass[i]='\0';
         printf("%s\n",pass);
         i=0;
          }
       }
      else
       {
         if(i>=MIN)
          {
         pass[i] = '\0';
         printf("%s\n",pass);
          }
         i=0;
       }
       }
      while(1);
      fclose(fp);
    }
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 89

      +2
      Забавно =)

      > если кому-то интересно, то могу выложить

      Интересно, выкладывай =)
        +4
        Автор, проплюсовал Вас, где только мог.
        Ушел экспериментировать.
          0
          У буржуев довольно давно существует такое направление как «memory forensics». Про линух не знаю точно, а вот для венды есть много полезных утилит для работы с полными дампами.
            +9
            Сидя как-то раз в барчике со своим другом проводили подобные эксперименты. Чтобы сильно сократить количество строк можете пройтись так:
            strings /proc/kcore | grep -A 50 -B 50 {username} | sort -u | uniq -u > /tmp/kdump.uniq
            Странно но пароль всегда находился в пределах +-50 строк от имени пользователя
              0
              А насколько сложные пароли были?
                +7
                стандартные пароли параноика…
                +1
                Попробовал. Пароля не нашел. Три машины с убунтой и дебианом.
                  0
                  странно только-что проверил — сработало
                    0
                    такое может происходить на машинах с интенсивной нагрузкой на оперативную память, этот способ не 100%
                    0
                    sort -u | uniq -u > /tmp/kdump.uniq
                    Зачем после sort посылать поток ещё и на uniq, если sort с ключиком -u уже делает и сортировку, и убирает дубликаты (делает строки уникальными). Бесполезно дублируете один и тот же функционал в одной командной конструкции.
                    –4
                    ух, жёстко! В закладки добавил, жаль плюсануть нечем!
                    *убежал пробовать на своих железках…
                      0
                      А если кроме длинны пароля еще исключать из словаря строки, заведомо не являющиеся паролями — то вообще сказка будет.
                      Например с 10 машин снять дамп и полностью повторяющиеся данные не брать в словарь больше никогда.
                      Есть конечно шанс потери пароля, но он пренебрежительно мал.
                        +33
                        Что бы читать память надо быть уже рутом.
                        А в каких участках памяти лежали пароли и зачем не смотрели?
                          +5
                          Да, но если рута взяли каким-нить эксплойтом, хацкер может получить пароли таким способом особо не тратя сил/ресурсов на брут и не создавая левых акков и т.д
                          Еще одна причина, как можно чаще менять пароли на серверах, даже параноидальные.
                            +9
                            а я как дурак думал что имея рута, можно тупо поменять пароль нужному логину и делать что надо не перебирая пароли
                              +10
                              Если удаеться проникнуть в удаленную систему и получить рута, надо быть действительно дураком чтобы сразу же поменять пароли.
                                +3
                                Оригинальный хеш пароля можно сохранить, заменить своим, сделать «дело», вернуть оригинальный хеш обратно.

                                Кроме того, существуют специальный скрипты. Легитимный пользователь пытается залогиниться, вход первый раз обламывается из-за другого хеша, но введенные данные сохраняются, хешируются и сравниваются с хешем неизвестного, после чего измененный хакером хеш затирается настоящим, и при второй попытке оригинальный пароль принимается. Способ универсальный на все 100%, работает даже на AIX и OpenVMS. Есть варианты попроще, с локальным проксированием FTP или SSH.
                                  0
                                  эээ, бекдор с правами рута? зачем менять пароли, а переход из рута под пользователя su username пароля не требует
                                    0
                                    Потому что эти пароли можно использовать при доступе на другие системы/сервисы, учитывая, что большинство пользователей не сильно отличается изобретательностью в придумывании паролей.
                                      0
                                      Немного не туда ответил.
                                +1
                                А почему не добавить ssh ключик, например? Кто из нас проверяет каждый день, сколько ключиков стоит на собственном аккаунте?
                                  0
                                  AIDE проверяет каждый день. Да хоть каждый час :-)
                                  www.cs.tut.fi/~rammer/aide.html

                                  и от лишних SSH ключиков защищает, и от затрояненых ssh и от прочих изменений на машине везде кроме /var/log/, /tmp и /var/www (как настроите).
                                0
                                дамп памяти можно попытаться чем-нибудь другим вызвать, без привелегий рута
                                  0
                                  можно, но не весь. либо весь, но привилегии должны быть суперпользователя(это как заставить, работающий демон от рута прочитать всю память).
                                    0
                                    напрямую, только доступную юзерленду. Там не может быть ничего интересного.
                                  +6
                                  [root@c5-04-s12 ~]# cat /proc/kcore
                                  cat: /proc/kcore: Operation not permitted

                                  [root@c5-04-s12 ~]# uname -a
                                  Linux c5-04-s12 2.6.23.14-107.fc8 #1 SMP Mon Jan 14 21:37:30 EST 2008 i686 i686 i386 GNU/Linux
                                  [root@c5-04-s12 ~]
                                    +5
                                    selinux?
                                      +8
                                      Да :)
                                      0
                                      mikuru:~# ls -lsah /proc/kcore
                                      0 -r-------- 1 root root 0 2010-03-18 12:50 /proc/kcore
                                      mikuru:~# uname -a
                                      Linux mikuru 2.6.32-trunk-sparc64-smp #1 SMP Mon Jan 11 02:14:07 UTC 2010 sparc64 GNU/Linux

                                      0_o
                                        +5
                                        selinux?
                                          +8
                                          да :)
                                        0
                                        Спасибо, хорошая статья.

                                        А с какой целью применяется sort -u | uniq -u?
                                          +1
                                          Отбросить повторы
                                            +1
                                            sort -u раве недостаточно?
                                              +1
                                              А просто sort -u недостаточно?
                                                0
                                                Отставить повторы :)
                                              0
                                              возможно сейчас уже нет необходимости в uniq -u, но у меня чисто машинально уже используется эта пара, т.к. раньше sort -u работал крайне криво.
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                +9
                                                под спецсимволами автор определяет команды процессора, которые НЕВОЗМОЖНО набрать с клавиатуры или распечатать в понятном человеку виде.
                                                И вы их не используете, поверьте мне.
                                                  0
                                                  пароль на граб + пароль на биос + защита от сброса кмос.
                                                    0
                                                    И замок на корпус-сейф, ну или шифрование, иначе все это смехотворно после извлечения винта.
                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                  0
                                                  То есть получается в памяти не хеш пароля хранится, а plain-text?
                                                    +1
                                                    да, но так же можно выцеплять ключи для шифрованых разделов на винчестере
                                                      0
                                                      Некоторое время. Довольно часто софтины после сверки пароля не затирают его в памяти, а если еще в промежутке он проходит через сетевые буфера, буфер ввода-вывода и чёрт еще знает что…
                                                      +1
                                                      Мне одному показалось что «Шварц» на фотке немного косит :)
                                                        +4
                                                        Если я правильно помню, в этот момент он себя не слишком хорошо чувствовал и это неудивительно. :)
                                                        0
                                                        Было бы интересно, если бы вы добавили еще и способы защиты от этого. По поводу swap на шифрованном разделе диска уже писали, а как можно защитить физическую память от такого доступа? Есть ли возможность запретить доступ к dev/mem или proc/kcore под юзером и оставить его только для root?
                                                          0
                                                          Вы сами подумайте, что Вы пишете?.. Есть какая-нибудь программа типа «login» — она как-то должна принять пароль у пользователя. Так или иначе, пароль от пользователя приходит в самом что ни на есть чистом виде — в виде букв-цифр-значков с клавиатуры. Так или иначе хоть какие-то миллисекунды, но он будет храниться в памяти, и, ввиду специфики архитектуры современных компьютеров, еще наверняка и закэшируется на 2-3 уровнях. Если есть возможность эту память читать — разумеется, всё это можно вытащить…
                                                            0
                                                            Вообще по-хорошему после использования эта область памяти должна затираться. Чтобы только в течение каких-то миллисекунд и можно было снять инфо.
                                                              0
                                                              Вы сами ответили на свой вопрос. Как хранится информация в БД любого современного движка? Хэш с солью. .htpasswd ведь не plain text хранит. Тем более «миллисекунды в памяти»- а не проще тогда кейлоггер поставить, чем читать дамп памяти в 2-4 Гб? Про чтение памяти- я и спросил, можно ли запретить юзеру чтение дампа памяти или нет. Читайте внимательнее.
                                                              +4
                                                              Он и так доступен только руту:
                                                              $ ll /proc/kcore
                                                              -r-------- 1 root root 4831842304 Мар 18 13:44 /proc/kcore

                                                              А если вы рут, то вы можете делать все, что угодно не только память читать. Так что никаких новых дыр это не несет.
                                                                +3
                                                                Вообще, /proc/kcore, /dev/mem и т.п. — это в первую очередь инструменты отладки. В production-системах их обычно отключают, во всяких hardened дистрибутивах и патчах (GRSecurity, OWL, Hardened *) — они отключены и запрещены по умолчанию, для затруднения доступа к паролям отдельных пользователей даже при какой-то компрометации root'а.
                                                                  0
                                                                  однако имея рута можно попробовать отключить selinux и т.п. вещи…
                                                                    0
                                                                    А разве нельзя вырубить в ядре, не? По моему можно.
                                                                      0
                                                                      можно, но потребуется перезагрузка.
                                                                        0
                                                                        Я имел в виду в ядре, через menu config к примеру.
                                                                        0
                                                                        или вы имели ввиду вот такой финт ушами?
                                                                        echo 0 > /selinux/enforce
                                                                  –6
                                                                  chmod?
                                                                    +1
                                                                    Есть ли возможность запретить доступ к dev/mem или proc/kcore под юзером и оставить его только для root?

                                                                    Так он и так запрещён под юзером, на это как бы намекает тот факт, что все команды в статье выполняются от имени рута (#).

                                                                    А вот что будет для обычного пользователя:
                                                                    $ less /proc/kcore
                                                                    /proc/kcore: Permission denied

                                                                    А для доп.защиты можно SELinux поставить…
                                                                    +2
                                                                    Глянул на генту-сервере:

                                                                    $ ls -l /dev/mem
                                                                    crw-r----- 1 root kmem 1, 1 Фев 18 12:20 /dev/mem

                                                                    $ ls -l /dev/kmem
                                                                    crw-r----- 1 root kmem 1, 2 Фев 18 12:20 /dev/kmem

                                                                    $ ls -l /proc/kcore
                                                                    -r-------- 1 root root 140737486262272 Мар 18 13:53 /proc/kcore

                                                                    Т.е. доступ только руту и участникам группы kmem, в число коих обычные юзеры не входят. На ноуте с Ubuntu аналогичные права. Обычные установки, без selinux и наворотов с безопасностью. А у рута куча других способов узнать пароли своих юзеров.

                                                                    Или я что-то не так понял или паника преждевременна.
                                                                      0
                                                                      А у рута куча других способов узнать пароли своих юзеров.


                                                                      Ну, если пароль хеширован и пользователь никогда не входил в систему, то будь вы хоть трижды рутом, а пароль этот достать сможете только брутом.
                                                                        +1
                                                                        В данном случае тоже, если юзер не входил, то неоткуда скопировать пароль.

                                                                        А если ты рут, то проще подменить бинарники, отвечающие за авторизацию, чем копаться в памяти :)
                                                                        При первом же логине все будет у вас.
                                                                          +2
                                                                          А зачем руту пароль пользователя, который никогда не входил в систему? Да и вообще зачем руту искать пароль пользователя, когда он спокойно может его сменить… :-)
                                                                            +1
                                                                            Ну конечно может, если ядро соответствующим образом не пропатчить :) Но речь-то шла о том как узнать пароль, а не сменить.
                                                                              0
                                                                              потому что этот же юзер johndoe так же имеет акк на соседнем сервере, с тем же паролем, куда мы (хакер-рут) не имеем пока доступа. Но расшифровав пароль, мы зайдем на тот сервер как белые люди, по ssh, и имея локальный доступ уже будет проще получить рута и там.
                                                                            0
                                                                            >-r-------- 1 root root 140737486262272 Мар 18 13:53 /proc/kcore
                                                                            Это нормальный размер в 140TB памяти? О_о
                                                                              0
                                                                              :) Значения размера kcore тоже не понял, на сервере приведенном в примере 12Гб + 1Гб swap.
                                                                            +1
                                                                            # cat /proc/kcore
                                                                            cat: /proc/kcore: No such file or directory

                                                                            :)
                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                0
                                                                                гента
                                                                              0
                                                                              Проверить, содержится ли пароль в памяти можно было и проще:
                                                                              strings /proc/kcore | grep «текущий реальный пароль»

                                                                              А еще полезно восстанавливать утраченный текст, к примеру, из полей упавшего браузера.
                                                                                0
                                                                                а grep сам себя не найдет в таком случае? :)
                                                                                  +1
                                                                                  grep -v grep | grep
                                                                                    +1
                                                                                    ой блин, уж лучше тогда пускай найдет, чем в три потока несколько гигабайт гнать
                                                                                    оптимизированнее будет strings /proc/kcore | grep «текущий реальный пароль» | grep -v grep
                                                                                      +1
                                                                                      Вы правы
                                                                                –2
                                                                                Доволен, и то как работают с памятью nix системы мне очень даже нравится, а смысла так таскать пароли не вижу. Да, /etc/shadow не судьба глянуть?
                                                                                  0
                                                                                  Пароли не лежат в открытом виде в /etc/shadow.
                                                                                  По-крайней мере по-умолчанию.
                                                                                  0
                                                                                  глянул у себя, размер файла kcore 1018 мегабайт, хотя на ноуте стоит 2 гига памяти, 2 планки по гигу, система 32 бита, генту, должно же быть 2 гигабайта длинна файла?
                                                                                    –4
                                                                                    в Убунту шифрование идет по средством sha512
                                                                                      –3
                                                                                      А так не забудьте пароль на recovery режим поставить для рута )
                                                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                                                        0
                                                                                        >Мануалы говорят, что полная длина этого файла — это размер физической памяти (RAM) плюс 4KB, но повертев этот файл на разных системах я пришел к выводу, что размер файла равен размеру RAM + SWAP.

                                                                                        $ sudo ls -lh /proc/kcore
                                                                                        -r-------- 1 root root 1016M Мар 18 16:25 /proc/kcore
                                                                                        $ free -m
                                                                                        total used free shared buffers cached
                                                                                        Mem: 2024 1975 49 0 29 1286
                                                                                        -/+ buffers/cache: 658 1366
                                                                                        Swap: 972 32 940


                                                                                        А где ещё почти 2 гектара?! o_O
                                                                                          0
                                                                                          $ ls -lh /proc/kcore
                                                                                          -r-------- 1 root root 128T Мар 18 23:59 /proc/kcore

                                                                                          И че c этим делать? o_O
                                                                                            0
                                                                                            Радоваться конечно.
                                                                                          +1
                                                                                          Вот две интересные ссылочки для заинтересованых
                                                                                          www.mcgrewsecurity.com/tools/msramdmp/
                                                                                          citp.princeton.edu/memory/
                                                                                            0
                                                                                            Актуально только если локальные хеши есть, с сетевой аунтификации типа Kerberos не прокатит. Но все равно полезно было узнать, спасибо.
                                                                                              0
                                                                                              Любопытно. Какое ПО у Вас хранит в RAM пароли? Особенно не на desktop.
                                                                                                –1
                                                                                                Автор статьи, судя по # в промте, сидит под рутом.

                                                                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                                Самое читаемое