Информационная безопасность

индекс
289,89

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

image
Ни для кого не секрет, что в 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);
}
+178
18 марта 2010, 11:38
113

комментарии (89)

+2
DZH #
Забавно =)

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

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

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

и от лишних SSH ключиков защищает, и от затрояненых ssh и от прочих изменений на машине везде кроме /var/log/, /tmp и /var/www (как настроите).
0
futureader #
дамп памяти можно попытаться чем-нибудь другим вызвать, без привелегий рута
0
loginex #
можно, но не весь. либо весь, но привилегии должны быть суперпользователя(это как заставить, работающий демон от рута прочитать всю память).
0
pgrishin #
напрямую, только доступную юзерленду. Там не может быть ничего интересного.
+6
bolk #
[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
mechmind #
selinux?
+8
bolk #
Да :)
0
Darka #
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
charon #
selinux?
+8
bolk #
да :)
0
Davidov #
Спасибо, хорошая статья.

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

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

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

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

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

$ 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
ipfw #
А у рута куча других способов узнать пароли своих юзеров.


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

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

:)
0
ZlobnyiSerg #
Mac OS? :)
0
hshhhhh #
гента
0
alteist #
Проверить, содержится ли пароль в памяти можно было и проще:
strings /proc/kcore | grep «текущий реальный пароль»

А еще полезно восстанавливать утраченный текст, к примеру, из полей упавшего браузера.
0
KKS #
а grep сам себя не найдет в таком случае? :)
+1
deespater #
grep -v grep | grep
+1
loginex #
ой блин, уж лучше тогда пускай найдет, чем в три потока несколько гигабайт гнать
оптимизированнее будет strings /proc/kcore | grep «текущий реальный пароль» | grep -v grep
+1
deespater #
Вы правы
–2
Constantin #
Доволен, и то как работают с памятью nix системы мне очень даже нравится, а смысла так таскать пароли не вижу. Да, /etc/shadow не судьба глянуть?
0
ipfw #
Пароли не лежат в открытом виде в /etc/shadow.
По-крайней мере по-умолчанию.
0
vinnishtein #
глянул у себя, размер файла kcore 1018 мегабайт, хотя на ноуте стоит 2 гига памяти, 2 планки по гигу, система 32 бита, генту, должно же быть 2 гигабайта длинна файла?
–4
MealstroM #
в Убунту шифрование идет по средством sha512
–3
MealstroM #
А так не забудьте пароль на recovery режим поставить для рута )
–4
andreyu #
"# strings /proc/kcore | sort -u | uniq -u > /tmp/kdump.uniq"

Похоже, что uniq -u лишнее, т.к. параметр -u в команде sort сделает то же самое.
0
Self_Perfection #
>Мануалы говорят, что полная длина этого файла — это размер физической памяти (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
Nebulosa #
$ ls -lh /proc/kcore
-r-------- 1 root root 128T Мар 18 23:59 /proc/kcore

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

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