четверг, 25 декабря 2008 г.

OpenSSH: Fake Banner

Конечно, хорошо пользоваться различными сканерами безопасности, которые позволяют определить ОС на удаленном хосте, который является целью Вашего pentesting'а. Но иногда злоумышленнику достаточно прочитать баннер сервиса (отметим, что пакеты GNU/Debian очень любят дописывать в свой баннер версию самой операционной системы). Например, в сконфигурированном нами OpenSSH баннер выглядит следующим образом
SSH-2.0-OpenSSH_4.3p2 Debian-9etch3

Прочитать этот баннер злоумышленник может, подсоединившись с помощью утилиты telnet к 8022 порту сервера.
Тогда перед системным администратором встает задача модифицировать баннер OpenSSH сервера.

Подготовка площадки
Сначала убедимся, что в файле /etc/apt/sources.list содержится запись на deb-src репозитарий.
root@cave:~# cat /etc/apt/sources.list | grep deb-src
#deb-src http://security.debian.org/ etch/updates main contrib
deb-src ftp://debian.sectorb.msk.ru/debian/ etch main
deb-src ftp://debian.sectorb.msk.ru/debian-security/ etch/updates main
Предполагаем, что в системе установлены пакеты up-to-date, если нет, то в целях обеспечения безопасности пакеты требуется обновить.
Если у Вас не установлены пакеты для сборки/пересборки .deb пакетов, то требуется выполнить следующую команду.
root@cave:~# apt-get install build-essential dpkg-dev debhelper devscripts fakeroot
В моем случае, так как установка производилась с netinstall дистрибутивом, требуется установить дополнительные пакеты (листинг только для build-essential)
The following extra packages will be installed:
binutils cpp cpp-4.1 dpkg-dev g++ g++-4.1 gcc gcc-4.1 libc6-dev libssp0 libstdc++6-4.1-dev linux-kernel-headers make patch
Подтвердите установку выбрав Y (Do you want to continue [Y/n]? Y), но прежде внимательно прочтите, не требуется ли apt-get (или aptitude) удалить нужные вам пакеты
The following NEW packages will be installed:
binutils build-essential cpp cpp-4.1 dpkg-dev g++ g++-4.1 gcc gcc-4.1 libc6-dev libssp0 libstdc++6-4.1-dev linux-kernel-headers make patch
0 upgraded, 15 newly installed, 0 to remove and 0 not upgraded.
Need to get 14.7MB of archives.
Также необходимо установить все библиотеки, которые необходимы для создания пакета, который Вы хотите модифицировать, а именно нужно выполнить команду
root@cave:~/openssh-4.3p2# apt-get build-dep openssh-server

Модификация исходников
Чтобы скачать исходники openssh-server нужно выполнить следующую команду
root@cave:~# apt-get source openssh-server
В результате ее выполнения в директории, откуда была запущенна команда появятся несколько файлов, в моем случае
root@cave:~# ls -la | grep openssh
drwxr-xr-x 7 root root 12288 2008-12-25 15:45 openssh-4.3p2
-rw-r--r-- 1 root root 275859 2008-09-17 01:02 openssh_4.3p2-9etch3.diff.gz
-rw-r--r-- 1 root root 1310 2008-09-17 01:02 openssh_4.3p2-9etch3.dsc
-rw-r--r-- 1 root root 920186 2006-05-12 16:17 openssh_4.3p2.orig.tar.gz
Если почитать немного исходники, а именно файлы openssh-4.3p2/version.h и openssh-4.3p2/debian/rules (можете добавить себе памятку, что debian/rules - это скрипт, который осуществляет сборку пакетов, иными словами, это Makefile), то становится понятным, как формируется баннер OpenSSH сервера. Номер версии и параметр PORTABLE (в данном случае приставка p2 в названии пакета) сервера определяется в version.h
#define SSH_VERSION "OpenSSH_4.3"
#define SSH_PORTABLE "p2"
Название дистрибутива в version.h содержится в
#define SSH_EXTRAVERSION
определяется данный параметр в файле rules

SSH_EXTRAVERSION := Debian-$(shell dpkg-parsechangelog | sed -n -e '/^Version:/s/Version: //p' | sed -e 's/[^-]*-//')
Чтобы изменить баннер достаточно несколько модернизировать файл openssh-4.3p2/version.h (в общем случае openssh-x.xx/debian/), исправив значение SSH_RELEASE, например, так
/* #define SSH_RELEASE SSH_VERSION SSH_PORTABLE SSH_EXTRAVERSION */
#define SSH_RELEASE "OpenSSH_0.9beta OpenBSD3.1"
Необходимо также внести изменения в changelog (чтобы при обновлении репозитария наши изменения не были затерты).
Чтобы сделать это можно поступить двумя способами.
  1. Открываем файл openssh-4.3p2/debian/changelog любимым текстовым редактором и правим первую строку - необходимо немного изменить название пакета, я бы сделал следующим образом
    openssh (1:4.3p2-9etch3FakeBanner) stable-security; urgency=high
    Этот способ прост, но он правильнее выбрать второй, так как он приучает к хорошему тону, красивому стилю и т.д.
  2. Находясь в директории модифицируемого пакета (в моем случае openssh-4.3p2), запускаем команду
    dch -i
    которая откроет файл debian/changelog для редактирования в текстовом редакторе по-умолчанию. Разница с 1-ым способом в том, что сразу будут сформированы блоки, согласно правилам описания модификаций пакетов (с данными правилами можно ознакомиться здесь). Ниже приведен мой пример записи в changelog
    openssh (1:4.3p2-9etch3FakeBanner) stable-security; urgency=low
    * only fake banner
    -- gurza Thu, 25 Dec 2008 16:38:41 +0300
Установка OpenSSH Fake Banner
Теперь необходимо собрать модифицированный пакет (полный мануал по сборке/пересборки пакетов GNU/Debian можно найти по адресу http://wiki.debian.org/DebianRussian/DebinstPackages и http://gq.net.ru/2007/03/16/building-deb-packages/). Находясь в директории модифицируемого пакета (в моем случае openssh-4.3p2), выполняем
root@cave:~/openssh-4.3p2# dpkg-buildpackage -rfakeroot
и откидываемся на спинку кресла. Все таки, имхо, GNU/Debian это дистрибутив для ленивых системных администраторов, которые не любят ждать выполнения ./configure && make && make install. Ну ради изменения баннера, или ради какой-нибудь более высокой цели подождать иногда приходится. Результатом выполнения данной команды будут deb пакеты в дирриктории выше.
Удаляем старый пакет OpenSSH Server (также придется временно удалить и клиента) командой
root@cave:~# dpkg -r openssh-server openssh-client
Удаление производится в смысле deinstall
deinstall
The package is selected for deinstallation (i.e. we want to remove all files, except configuration files).
То есть удаляются только бинарные файлы, а файлы конфигурации и сгенерированные ключи остаются на месте. Теперь необходимо установить модифицированные пакеты
root@cave:~# dpkg -i openssh-server_4.3p2-9etch3FakeBanner_amd64.deb openssh-client_4.3p2-9etch3FakeBanner_amd64.deb
Проверим теперь баннер OpenSSH сервера
root@cave:~# telnet localhost 8022
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_0.9beta OpenBSD3.1
^]
telnet> quit
Connection closed.
Все работает именно так, как мы и хотели.

2 комментария:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. Thanks for good article, but there is slightly easier method:
    just add
    "DebianBanner none" to the /etc/ssh/sshd_config

    ОтветитьУдалить