-----------------------------------------
#! /usr/share/doc/defaced/2/tandp/lof.txt
-----------------------------------------
Local OS Fingerprinting
-----------------------
Содержание
----------
1. Введение
2. Источники информации
- $OSTYPE
- /etc/motd
- release
- dmesg
- /etc/shells
- man
- /bin/ls
- другое
- sysctl
3. Приложение [ versioner.py ]
1. Введение
Практически в каждой статье, описывающей получение неавторизованного доступа к
системе посредством уязвимости какого-либо сценария CGI, говорится, что первым
шагом на пути к элевации привилегий после получения возможности выполнения
команд оболочки через веб-сервер, является идентификация целевой системы. В
качестве инструмента идентификации предлагается встроенная системная команда
системы uname. Так вот, на самом деле, вывод команды uname не вляется панацеей,
так как программа может быть модифицирована системным администратором так, чтобы
отпугнуть нападающего, выведя что-то вроде `Private Lamux Release 6.6.6p13'. Как
правило, неопытный нападающий, не найдя эксплоита к этой системе на пакетсторме,
оставит эту машину в покое. Впрочем, на самом деле, вам вряд ли встретится такое
название системы.
Чаще всего это вполне существующее имя операционной системы и версия, которые
между тем, не соответствуют действительной системе, к которой вы получили
доступ. Хитрый администратор может переписать код программы таким образом, что
при ее вызове с каким-либо параметрами или без оных, она выводила совсем не то,
что есть на самом деле.
В данной статье я расскажу о различных источниках получения информации о системе
при наличии к ней локального доступа..
Сразу хочу поблагодарить OverG [ m00 security ] и JLx [ ZUDteam ] за
предоставленную информацию по системам Linux и OpenBSD.
2.1 Переменная окружения OSTYPE.
Данная системная переменная содержит имя [ тип ] системы. Смотрим ее значение:
satanic# printenv |grep OSTYPE
OSTYPE=FreeBSD
или непосредственно:
satanic# echo $OSTYPE
FreeBSD
Это же справедливо и для систем Linux.
2.2 Файл /etc/motd
Файл /etc/motd [ Message Of The Day ] по умолчанию содержит некоторую
приветственную информацию для пользователей - то, что они увидят при входе в
систему с локального или удаленного терминала [ telnet/ssh ], равно как и версию
системы. Содержимое этого файла можно изменить, указав там неверные версию и тип
системы, а можно удалить совсем. Тогда при подключении пользователь увидит
пустой экран и вывод сообщений программы login. Но проверить никогда не мешает [
вдруг его не удалили/изменили ]:
satanic# more /etc/motd
FreeBSD 4.5-RELEASE (KERN1) #0: Mon Jan 28 14:31:56 GMT 2002
<пропущено>
satanic$ more /etc/motd
OpenBSD 3.1-stable (GENERIC) #4: Mon Mar 31 08:10:49 MST 2003
<пропущено>
2.3. Фaйл release.
Почти все системы, по крайней мере Linux, FreeBSD, SunOS/Solaris имеют файл
release [ или аналогичный ему ] в директории /etc или еще где-либо в системе.
Впрочем, этот файл точно есть в FreeBSD версии 4.x, однако из 5.0 его удалили.
Это же касается OpenBSD версий 3.x. В системах Linux имя этого файла зависит от
дистрибутива системы. В общем случае это выглядит так:
/etc/имя_дистрибутива-release
например:
/etc/redhat-release
/etc/mandrake-release
и так далее.
Вот примеры файлов release для разных систем:
Solaris /etc/release:
::::::::::::::
/etc/release
::::::::::::::
Solaris 9 9/02 s9s_u1wos_08b SPARC
Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 09 August 2002
Linux /etc/redhat-release:
Red Hat Linux release 7.3 (Valhalla)
Linux /etc/mandrake-release:
Mandrake Linux release 9.0 (dolphin) for i586
Однако содержимое этого файла легко изменить. Часто его просто удаляют, поэтому
не стоит особо на него рассчитывать - просто нужно иметь в виду как возможный
вариант.
2.4 Команда dmesg
Насколько мне известно, эта команда специфична исключительно для BSD систем. Эта
команда читает содержимое файла /var/run/dmesg.boot, в который записываются все
выводимые ядром сообщения при загрузке системы [ в том числе и версия
операционной системы ].
satanic# more /var/run/dmesg.boot
или
satanic# dmesg |less
Copyright (c) 1992-2002 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD 4.5-RELEASE #0: Mon Jan 28 14:31:56 GMT 2002
<пропущено>
2.5 Файл /etc/shells
Файл /etc/shells, равно и как и практически любой файл конфигурации, библиотеки
и прочие файлы содержит запись, в которой имеется имя операционной системы. Вот
пример файла /etc/shells:
# $FreeBSD: src/etc/shells,v 1.3.2.1 2000/07/10 08:47:17 obrien Exp $
#
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/sh
/bin/csh
/bin/tcsh
Как видно, это файл из системы FreeBSD [ судя по $FreeBSD в первой строке ].
Естесственно, администратор может просто удалить эту строку из этого файла [ да
и из всех остальных также, написав немудреную программку ], однако это лишние
хлопоты, да и потом в последующем это может вызвать проблемы при обновлении
системы.
2.6 Файлы man
Как правило, любой man-файл содержит строку такого вида:
$FreeBSD: src/sbin/sysctl/sysctl.8,v 1.23.2.13 2001/12/19 15:13:31 tobez Exp $
То есть просто обратившись к странице руководства, скажем по программе ls, можно
узнать, что это за система.
2.7 Файл /bin/ls
Каждый двоичный файл, скомпилированный в конкретной системе при помощи gcc будет
содержать строки, подобные этим:
<пропущено>
$FreeBSD: src/lib/libc/string/strncpy.c,v 1.1.1.1.14.1 2001/07/09 23:30:07
obrien Exp$
$FreeBSD: src/lib/libc/string/strerror.c,v 1.2.14.2 2001/12/20 06:31:26 wes Exp
$ Unknown error:
<пропущено>
Эта информация добавляется компилятором в процессе сборки и компиляции
программы, а берется она как правило из системных библиотек [ файлов .h ]. То
есть вы просто берете файл, скажем, открываете его в вашем любимом hex-редакторе
[ я предпочитаю hexpert ] и ищете строки наподобие тех, что приведены выше.
2.8 Другое
Также о типе системы можно судить по структуре директорий, специфичным для
каждой из них файлам и командам. Однако необходимо учитывать тот факт, что
FreeBSD и Unix системы в целом являются мультиплатформенными, а потому ваш
эксплоит для x86 уж точно не будет работать на процессоре SPARC или MIPS из-за
архитектурных различий.
2.9 sysctl
И все же в большинстве случаев для нас остаются неизвестными так важные нам
версия системы и уровень релиза. Тогда я решил копать uname.c и dmesg.c на
предмет того, откуда берутся эти данные, так как в самих исходниках их,
естесственно, нет. Я набрал:
satanic# man 3 uname
и увидел ссылку на файл ustname.h, в котором требуемой информации не было.
Посмотрев ссылки, приведенные в вышеупомянутом мане, я разглядел sysctl.h. И вот
оно чудо!! Смотрю man sysctl и нахожу там то что мне и нужно было. Вот кусок
мана:
================================== man sysctl ==================================
The changeable column indicates whether a process with appropriate privilege can
change the value.
Name Type Changeable
kern.ostype string no
kern.osrelease string no
kern.osrevision integer no
kern.version string no
kern.maxvnodes integer yes
kern.maxproc integer no
kern.maxprocperuid integer yes
kern.maxfiles integer yes
kern.maxfilesperproc integer yes
kern.argmax integer no
kern.securelevel integer raise only
kern.hostname string yes
kern.hostid integer yes
kern.clockrate struct no
kern.posix1version integer no
================================== man sysctl ==================================
Обратите внимание на параметры kern.ostype, kern.osrelease, kern.osrevision и
kern.version -именно они используются программами uname и dmesg, и что самое
главное, они _не изменяются_ средствами системы!! То есть, конечно, в open
source системе не может быть ничего такого, что нельзя было бы поменять. Но в
данном случае не поможет указание значений параметров в файле /etc/sysctl.conf.
Исправить это можно лишь путем изменения файла /sys/conf/newvers.sh и сборки
собственного релиза. Однако при этом все равно будут действовать другие
описанные мной способы получения информации. К тому же, даже самый отчаянный
администратор вряд ли пойдет на этот шаг. Почему?? Да потому что при обновлении
системы через CVS, чем регулярно занимается любой нормальный админ, возникнут
серьезные проблемы, так как там будет прописана совершенно левая система и
версия. Будет проще подумать над тем, как ограничить пользователю доступ к этим
командам, или же сменить мозги.
Используется все это дело следующим образом:
satanic# sysctl -n kern.ostype
FreeBSD
При выполнении программы без каких-либо дополнительных параметров, выводится
текущее значение того или иного параметра системы.
Назначение того или иного параметра можно посмотреть при помощи параметра -d [
от description ].
В системах Linux названия параметров несколько иные:
kernel.version = #1 Thu Apr 18 07:37:53 EDT 2002
kernel.osrelease = 2.4.18-3
kernel.ostype = Linux
Приложение
----------
Специально для данной статьи я написал небольшую программу, которая подскажет
вам, основываясь на данных, полученных через интерфейс sysctl, что это за
система - BSD или Linux.
versioner.py
#! /usr/bin/env python
##
# versioner.py
# by euronymous /f0kp [ http://f0kp.iplus.ru ]
##
import os
import sys
BSD = os.popen('sysctl -n kern.ostype', 'r')
BSD = BSD.read()
Linux = os.popen('sysctl -n kernel.ostype', 'r')
Linux = Linux.read()
if len(BSD) == 0:
print Linux
else:
print BSD
... np: Satyricon - Min Hyllest Til Vinterland.mp3