Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux

360 views

Published on

Руткиты в мире основанных на ядре Linux операционных систем уже не являются редкостью. Рассказ будет о том, как попытки в современных реалиях определить то, скомпрометирована ли система, привели к неожиданному результату.

Published in: Internet
  • Be the first to comment

  • Be the first to like this

[Defcon Russia #29] Михаил Клементьев - Обнаружение руткитов в GNU/Linux

  1. 1. Обнаружение руткитов в GNU/Linux Клементьев Михаил DCG #7812 10 марта 2017 г.
  2. 2. $ whoami Linux Kernel Security Developer
  3. 3. $ whoami Linux Kernel Security Developer Security researcher at
  4. 4. $ whoami Linux Kernel Security Developer Security researcher at Hardened Gentoo lover
  5. 5. $ whoami Linux Kernel Security Developer Security researcher at Hardened Gentoo lover Associate member of
  6. 6. $ agenda Что есть руткит (scope)
  7. 7. $ agenda Что есть руткит (scope) Как снизить вероятность заражения
  8. 8. $ agenda Что есть руткит (scope) Как снизить вероятность заражения Как избавиться от того, что уже внутри? (inb4: сжечь)
  9. 9. $ agenda Что есть руткит (scope) Как снизить вероятность заражения Как избавиться от того, что уже внутри? (inb4: сжечь) Паника
  10. 10. $ agenda Что есть руткит (scope) Как снизить вероятность заражения Как избавиться от того, что уже внутри? (inb4: сжечь) Паника Паранойя
  11. 11. $ agenda Что есть руткит (scope) Как снизить вероятность заражения Как избавиться от того, что уже внутри? (inb4: сжечь) Паника Паранойя Скорбь
  12. 12. $ agenda Что есть руткит (scope) Как снизить вероятность заражения Как избавиться от того, что уже внутри? (inb4: сжечь) Паника Паранойя Скорбь О проекте по обнаружению руткитов
  13. 13. Who is Mr. Rootkitsky?
  14. 14. Who is Mr. Rootkitsky?
  15. 15. Меня поломали?
  16. 16. Linux Kernel Vulnerabilities By Year (1999-2017)
  17. 17. Linux Kernel Vulnerabilities By Type (1999-2017)
  18. 18. Меня поломали? Да.
  19. 19. Как не словить? Использование электронной подписи для модулей ядра
  20. 20. Как не словить? Использование электронной подписи для модулей ядра Обеспечение безопасность рабочего компьютера администратора
  21. 21. Как не словить? Использование электронной подписи для модулей ядра Обеспечение безопасность рабочего компьютера администратора Знание о том, что происходит на вашей системе (что должно быть, а чего не должно быть)
  22. 22. Как не словить? Использование электронной подписи для модулей ядра Обеспечение безопасность рабочего компьютера администратора Знание о том, что происходит на вашей системе (что должно быть, а чего не должно быть) Разграничение полномочий
  23. 23. Как не словить? Использование электронной подписи для модулей ядра Обеспечение безопасность рабочего компьютера администратора Знание о том, что происходит на вашей системе (что должно быть, а чего не должно быть) Разграничение полномочий Обновление!
  24. 24. И что, это поможет?
  25. 25. И что, это поможет? Нет.
  26. 26. Какие бывают? User-space
  27. 27. Какие бывают? User-space Kernel-space
  28. 28. Чем могут заниматься? Подмена системных файлов
  29. 29. Чем могут заниматься? Подмена системных файлов Изменение логов
  30. 30. Чем могут заниматься? Подмена системных файлов Изменение логов Изменение исполняемых файлов при старте
  31. 31. Чем могут заниматься? Подмена системных файлов Изменение логов Изменение исполняемых файлов при старте Скрытие процессов
  32. 32. Чем могут заниматься? Подмена системных файлов Изменение логов Изменение исполняемых файлов при старте Скрытие процессов Скрытие сетевых соединений
  33. 33. Чем могут заниматься? Подмена системных файлов Изменение логов Изменение исполняемых файлов при старте Скрытие процессов Скрытие сетевых соединений Защита от обнаружения
  34. 34. Чем могут заниматься? Подмена системных файлов Изменение логов Изменение исполняемых файлов при старте Скрытие процессов Скрытие сетевых соединений Защита от обнаружения Много всего остального, о чем знают только разработчики
  35. 35. Open source решения chkrootkit (http://www.chkrootkit.org/ | 30.10.2016)
  36. 36. Open source решения chkrootkit (http://www.chkrootkit.org/ | 30.10.2016) unhide (http://www.unhide-forensics.info/ | 26.05.2013)
  37. 37. Open source решения chkrootkit (http://www.chkrootkit.org/ | 30.10.2016) unhide (http://www.unhide-forensics.info/ | 26.05.2013) rkhunter (http://rkhunter.sf.net/ | 24.02.2014)
  38. 38. Open source решения chkrootkit (http://www.chkrootkit.org/ | 30.10.2016) unhide (http://www.unhide-forensics.info/ | 26.05.2013) rkhunter (http://rkhunter.sf.net/ | 24.02.2014) kjackal (https://github.com/dgoulet/kjackal | 16.06.2014)
  39. 39. Используемые методы Поиск нарушений консистентности предоставляемой ядром информации
  40. 40. Используемые методы Поиск нарушений консистентности предоставляемой ядром информации Сравнение содержимого procfs с выводом команды ps aux
  41. 41. Используемые методы Поиск нарушений консистентности предоставляемой ядром информации Сравнение содержимого procfs с выводом команды ps aux Поиск конкретных файлов известных руткитов
  42. 42. Используемые методы Поиск нарушений консистентности предоставляемой ядром информации Сравнение содержимого procfs с выводом команды ps aux Поиск конкретных файлов известных руткитов Проверка целостности (e.g. с помощью rpm)
  43. 43. Используемые методы Поиск нарушений консистентности предоставляемой ядром информации Сравнение содержимого procfs с выводом команды ps aux Поиск конкретных файлов известных руткитов Проверка целостности (e.g. с помощью rpm) Перебор идентификаторов процесса
  44. 44. На чем бы проверить?
  45. 45. На чем бы проверить?
  46. 46. первый попавшийся rootkit с github vs chrootkit Hook таблицы системных вызовов и скрытие себя # make && insmod open−h i j a c k . c # dmesg [ 1 9 0 . 0 4 9 ] Simple mod : o r i g f f f f f f f f 8 1 2 0 b 9 4 0 new addr # c h k r o o t k i t −q ens3 : PACKET SNIFFER(/ sbin / d h c l i e n t [ 1 5 5 7 ] ) # rkhunter −c −q p e r l : warning : Please check that your l o c a l e s e t t i n g LANGUAGE = ( unset ) , LC_ALL = ( unset ) , LC_CTYPE = "ru_RU . utf8 " , LANG = "ru_RU . utf8 " are supported and i n s t a l l e d on your system . p e r l : warning : F a l l i n g back to the standard l o c a l e (
  47. 47. Может быть он слишком простой?
  48. 48. github.com/NoviceLive/research-rootkit [ 5879.008563] pshidko . init_module : Greetings the World ! [ 5879.009880] pshidko . init_module : Opening the path : / proc . [ 5879.011110] pshidko . init_module : Succeeded in opening : / proc [ 5879.012376] pshidko . init_module : Changing file_op −>i t e r a t e from f f f f f f f f 8 1 2 7 a 0 0 0 to f f f f f f f f c 0 0 3 c 0 0 0 .
  49. 49. github.com/NoviceLive/research-rootkit # ps aux . . . # dmesg [ 6225.613397] pshidko . f a k e _ f i l l d i r : Hiding pid : 1 # rkhunter Checking f o r hidden f i l e s and d i r e c t o r i e s [ None found ] Rootkit checks . . . Rootkits checked : 299 P o s s i b l e r o o t k i t s : 0 # c h k r o o t k i t Checking ‘ lkm ’ . . . You have 1 process hidden f o r r e a d d i r command # unhide quick Found HIDDEN PID : 1 Command : " i n i t [ 2 ] "
  50. 50. Как нашелся? chkrootkit: #d e f i n e MAX_PROCESSES 999999 /∗ Brute f o r c e ∗/ s t r c p y ( buf , "/ proc /"); r e t p s = r e t d i r = 0; f o r ( i = FIRST_PROCESS ; i <= MAX_PROCESSES; i++) . . . j = r e a d l i n k ("./ cwd" , path , s i z e o f ( path ) ) ; . . .
  51. 51. Как нашелся? unhide: // PID under 301 are r e s e r v e d f o r k e r n e l f o r ( x=0; x < 301; x++) { a l l p i d s [ x ] = 0 ; a l l p i d s 2 [ x ] = 0 ; } f o r ( z =301; z < maxpid ; z++) { a l l p i d s [ z ] = z ; a l l p i d s 2 [ z ] = z ; } f o r ( i =301; i < maxpid ; i++) . . . .
  52. 52. Как нашелся? unhide: void get_max_pid ( i n t ∗ newmaxpid ) { char path []= "/ proc / sys / k e r n e l /pid_max "; pid_t tmppid = 0; FILE∗ fd= fopen ( path ," r " ) ; i f ( ! fd ) { warnln (1 , unlog , "Cannot read c u r r e n t maximum r e t u r n ; }
  53. 53. Значит, что все-таки есть эффективные антируткиты под Linux?
  54. 54. Значит, что все-таки есть эффективные антируткиты под Linux? Нет.
  55. 55. My Little Fix /∗ ∗ A maximum of 4 m i l l i o n PIDs should be ∗ enough f o r a while . ∗ [NOTE: PID/TIDs are l i m i t e d to ∗ 2^29 ~= 500+ m i l l i o n , see f u t e x . h . ] ∗/ #d e f i n e PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE ∗ 8 : ( s i z e o f ( long ) > 4 ? 4 ∗ 1024 ∗ 1024 : PID_MAX_DEFAULT))
  56. 56. My Little Fix Перед стартом процесса pid_max устанавливается в PID_MAX_LIMIT-N Запуск процесса Снижение pid_max до прошлого значения
  57. 57. My Little Fix # ps aux . . . # dmesg [14365.243616] pshidko . f a k e _ f i l l d i r : Start process [14965.325102] pshidko . f a k e _ f i l l d i r : Hiding pid : 412 # rkhunter Checking f o r hidden f i l e s and d i r e c t o r i e s [ None found ] Rootkit checks . . . Rootkits checked : 299 P o s s i b l e r o o t k i t s : 0 # c h k r o o t k i t // None found # unhide // None found
  58. 58. kjackal Особенности: Небольшой (≈ 700 строк) Мертвый (разработка остановлена в 2013)
  59. 59. kjackal $ make | tail -n 4 make[2]: *** [scripts/Makefile.build:294: kjackal/src/module.o] Ошибка 1 make[1]: *** [Makefile:1490: _module_/kjackal] Ошибка 2 make[1]: выход из каталога «/usr/src/linux» make: *** [Makefile:26: default] Ошибка 2
  60. 60. Houston, we have a problem.
  61. 61. Houston, we have a problem. Эффективных антируткитов нет :(
  62. 62. Что дальше?
  63. 63. Что дальше? Programming, Motherfucker.
  64. 64. Programming, Motherfucker Kernel-level
  65. 65. Programming, Motherfucker Kernel-level Только общие методы (проверить наличие /proc/enyo и chkrootkit может)
  66. 66. Обнаружение: Встраивание в планировщик процессов
  67. 67. Обнаружение: Встраивание в планировщик процессов Основные причины вызова schedule(): Регулярное обновление текущей задачи с помощью scheduler_tick()
  68. 68. Обнаружение: Встраивание в планировщик процессов Основные причины вызова schedule(): Регулярное обновление текущей задачи с помощью scheduler_tick() Задача приостанавливается
  69. 69. Обнаружение: Встраивание в планировщик процессов Основные причины вызова schedule(): Регулярное обновление текущей задачи с помощью scheduler_tick() Задача приостанавливается Задача возобновляет выполнение (→ try_to_wake_up())
  70. 70. Обнаружение: Встраивание в планировщик процессов try_to_wake_up(): Помещает задачу в очередь выполнения задач
  71. 71. Обнаружение: Встраивание в планировщик процессов try_to_wake_up(): Помещает задачу в очередь выполнения задач Изменяет состояние задачи на “TASK_RUNNING”
  72. 72. Обнаружение: Встраивание в планировщик процессов try_to_wake_up(): Помещает задачу в очередь выполнения задач Изменяет состояние задачи на “TASK_RUNNING” Если пробуждаемая задача имеет приоритет выше текущей задачи, то производит вызов планировщика с целью перепланирования задач
  73. 73. Обнаружение: Встраивание в планировщик процессов i n t hook_try_to_wake_up ( s t r u c t task_struct ∗p , unsigned i n t state , i n t wake_flags ) { p r i n t k ("p−>pid : %d , p−>comm: %s n" , p−>pid , r e t u r n origin_try_to_wake_up ( p , state , wake_flags ) ; }
  74. 74. Обнаружение: Встраивание в планировщик процессов dmesg: [ 9 4 . 5 6 8 ] p−>pid : 1749 , p−>comm: r s y s l o g d [ 9 4 . 5 6 9 ] p−>pid : 1747 , p−>comm: r s : main Q: Reg [ 9 4 . 5 7 2 ] p−>pid : 1749 , p−>comm: r s y s l o g d [ 9 4 . 5 7 3 ] p−>pid : 1747 , p−>comm: r s : main Q: Reg [ 9 4 . 5 7 6 ] p−>pid : 1749 , p−>comm: r s y s l o g d [ 9 4 . 5 7 7 ] p−>pid : 1747 , p−>comm: r s : main Q: Reg [ 9 4 . 5 8 0 ] p−>pid : 1749 , p−>comm: r s y s l o g d [ 9 4 . 5 8 1 ] p−>pid : 1935 , p−>comm: hiddenprocess [ 9 4 . 6 0 5 ] p−>pid : 1747 , p−>comm: r s : main Q: Reg
  75. 75. Двигаться дальше Проверка согласованности структур данных ядра Самозащита со стороны антируткита Поддержка других реализаций планировщика ядра
  76. 76. Вопросы?
  77. 77. Спасибо за внимание! Клементьев Михаил <gofuckyourself@riseup.net> /* github.com/jollheef */

×