-----------------------------------------
#! /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