
Расширьте видимость сети с нескольких точек зрения других хостов.
В военном деле CornerShot — это оружие, позволяющее солдату заглянуть за угол (и, возможно, сделать выстрел), не подвергая себя риску. Подобным образом пакет CornerShot позволяет проверить сетевой доступ удалённого хоста без необходимости иметь какие-либо особые привилегии на этом хосте.
С помощью CornerShot источник, имеющий сетевой доступ к носителю, может определить, есть ли сетевой доступ между носителем и целью для конкретного порта p.
Например, предположим, что красная команда пытается распространиться от «скомпрометированного» хоста-источника A к целевому хосту X, к которому у хоста A нет доступа. Если они будут распространяться через хост B, то лишь тогда обнаружат, что между хостом B и X нет сетевого доступа.
Используя CornerShot, команда может выяснить, что на самом деле хост C имеет доступ к цели X, поэтому для распространения к цели X сначала нужно пройти через хост C.
+-----+ +-----+ +-----+
| | | | filtered | |
| A +--------> B +----X--->(p) X |
| | | | | |
+-----+ +-----+ +-(p)-+
source carrier target
+ ^
| |
| +-----+ |
| | | open |
+---------->+ C +-------------+
| |
+-----+
Как и nmap, CornerShot различает следующие состояния портов: open, closed, filtered и unknown (если определить не удаётся).
На следующей демонстрации показан запуск CornerShot против двух хостов-носителей 172.0.1.12 и 172.0.1.13 для определения, имеют ли они сетевой доступ к 192.168.200.1:

Подробнее читайте здесь.
Казалось бы, простая задача — определить, имеет ли хост B в сети доступ к хосту C — может потребовать массового развёртывания сетевых датчиков, агентов на устройствах или сбора множества правил брандмауэра, конфигураций маршрутизаторов и политик хостов.
CornerShot может упростить этот процесс, используя одного (или очень мало) агентов, которые могут опрашивать другие хосты в сети для определения их доступа к удалённым хостам.
Команды безопасности, использующие BloodHound для поиска и устранения путей повышения привилегий в своей сети, часто сталкиваются с миллионами логических путей, обнаруженных BloodHound.
ShotHound — это инструмент, который интегрирует CornerShot с BloodHound для обнаружения практических путей, поддерживаемых сетевым доступом.
CornerShot можно использовать как пакет или как отдельный модуль. Единственные требования — Python 3 и пакет impacket.
pip install cornershot
Для базового использования требуются учётные данные действительного доменного пользователя, полное доменное имя домена, IP-адрес носителя и целевой IP-адрес.
python -m cornershot <user> <password> <domain> <carrier> <target>
Для сканирования диапазона носителей и диапазона целей можно использовать подсети или диапазоны IP-адресов, перечисленные через запятую:
python -m cornershot <user> <password> <domain> 192.168.1.10-192.168.1.20 192.168.5.0/24,192.168.6.0/24
По умолчанию CornerShot пытается сканировать следующие порты: 135, 445, 3389, 5985, 5986. Пользователь может указать список портов и диапазонов портов через запятую:
python -m cornershot -tp 22,8080,45000-45005 <user> <password> <domain> <carrier> <target>
В коде необходимо создать экземпляр объекта CornerShot с именем пользователя, паролем и именем домена действительного доменного пользователя. Добавление носителей, целей и портов осуществляется через метод add_shots. Когда всё готово, можно вызвать метод open_fire, который выполняет только необходимые вызовы RPC на основе требуемых портов.
from cornershot import CornerShot
cs = CornerShot("username", "password", "fqdn")
cs.add_shots(carriers=["192.168.1.1"],targets=["192.168.1.2","192.168.1.3"])
results = cs.open_fire()
Результат open_fire — это словарь, ключами которого являются носители, у каждого носителя — ещё один набор ключей для целей, и, наконец, каждая цель содержит словарь портов и их соответствующих состояний. Пример формата результата:
{'carrier_1':
{'target_1':
{135: 'unknown', 445: 'filtered', 3389: 'filtered', 5986: 'filtered', 5985: 'filtered'},
'target_2':
{135: 'unknown', 445: 'open', 5985: 'unknown', 5986: 'filtered', 3389: 'open'}
},
'carrier_2':
{'target_1':
{3389: 'filtered', 135: 'filtered', 5985: 'filtered', 445: 'filtered', 5986: 'unknown'},
'target_2':
{5985: 'filtered', 5986: 'filtered', 445: 'filtered', 135: 'filtered', 3389: 'open'}
}
}
CornerShot использует различные, хорошо задокументированные стандартные методы удалённого вызова процедур (RPC), которые применяются в различных сервисах Microsoft. Используя методы, для которых требуется только аутентифицированная учётная запись в домене, CornerShot может инициировать сетевой трафик от хоста-носителя к цели.
CornerShot определяет состояние порта удалённого хоста, измеряя время выполнения вызова RPC и используя различные коды ошибок для каждого метода RPC.
Возможно, читатель знаком с "printer bug", обнаруженным Lee Christensen. Хотя это называют ошибкой, это хорошо задокументированное поведение службы печати, которое позволяет любому аутентифицированному пользователю принудить удалённый сервер к аутентификации на любой машине с помощью метода RpcRemoteFindFirstPrinterChangeNotificationEx.
CornerShot использует следующие методы RPC из нескольких протоколов Microsoft (существует множество дополнительных методов, которые будут реализованы в будущих версиях):
Реализация самих протоколов осуществляется с помощью замечательного пакета impacket.
Этот метод принимает параметр printerName. Имя принтера может быть путём к локальному файлу, удалённому файлу или даже к веб-принтеру. Указав имя, соответствующее формату WEB_PRINT_SERVER, можно опросить любой удалённый порт. Пример имени веб-принтера, которое инициирует HTTP-трафик к удалённому хосту и порту: "http://<target_ip>:<target_port>/printers/ppp/.printer".
Для использования этого метода требуется два шага: сначала открыть ключ реестра на удалённом хосте — это даёт действительный дескриптор, а затем попытаться сохранить резервную копию этого дескриптора в удалённый файл. Метод BaseRegSaveKey принимает путь к файлу, в который можно сохранить резервную копию реестра, что инициирует SMB-трафик через порт 445 (и 135 как резервный) к цели. Ключ реестра, который открывает CornerShot, — это HKEY_CURRENT_USER, который по умолчанию открыт для чтения на большинстве клиентских хостов.
Эта функция пытается создать резервную копию событий Windows в файл, который может быть удалённым — в таком случае служба попытается обратиться к удалённому хосту и пути.
Аналогично методу EVEN, только этот метод использует другую версию протокола событий Windows, которая работает напрямую через TCP — нет необходимости в открытом порту SMB.
CornerShot оценивает состояние удалённых портов на основе временных факторов и сообщений об ошибках, полученных от метода RPC или нижележащего транспорта. Путём экспериментов с различными хостами Windows и разными протоколами RPC мы вывели три различных временных порога, которые оказываются эффективными в большинстве сетевых сред. Эти пороги лучше всего проиллюстрировать на следующем рисунке:
+ + +
| | |
unknown | open / closed | filtered | open
/ | | |
open | | |
| | |
+-------------+------------------+-----------------+--------------+
0 0.5 20 40 Seconds
MIN FILTERED UPPER
Порог MIN составляет 0,5 секунды. Ответы ниже этого порога либо означают ошибку в нижележащем методе RPC или транспорте, либо ответ мог быть получен от целевого хоста.
Ответы ниже порога FILTERED (20 секунд) могут указывать как на открытый, так и на закрытый порт, в зависимости от типа сообщения об ошибке, полученного для данного метода.
Ответы между порогами FILTERED и UPPER (40 секунд) указывают на фильтрованный порт для всех протестированных методов (пока что...). А запросы, занимающие больше времени, чем верхний предел, указывают на продолжительное открытое TCP-соединение.
Выполнение CornerShot против разных версий и конфигураций ОС даст разные результаты. Не все версии Windows имеют одинаковые именованные каналы или ведут себя одинаково при запросе одним и тем же методом RPC. Большинство Windows «из коробки» не будут открывать SMB и другие службы RPC по сети, однако опыт показывает, что в крупных средах эти порты часто открыты и доступны для большинства активов.
В следующей таблице показана поддержка различных протоколов RPC по умолчанию при условии, что соответствующие порты доступны хосту-носителю и в конфигурацию хоста не вносились изменения:
* Если на клиентской машине запущена служба Webclient, можно сканировать дополнительные порты. В настоящее время CornerShot не поддерживает эту возможность.
** Протокол RPRN поддерживается на серверных хостах, однако открытие удалённого веб-принтера не работает (поэтому мы не можем сканировать ЛЮБОЙ целевой порт) — до тех пор, пока мы не найдём обходной путь 😉
Дополнительные RPC-«выстрелы» или любой другой вклад приветствуются!
Все методы RPC реализованы в папке /shots и наследуются от абстрактного класса BaseRPCShot. В папке /example показано, как создать собственный RPC-выстрел и использовать его в коде.
CornerShot выпущен под лицензией Apache 2.0. Подробнее см. LICENSE.
Мы будем рады услышать вас! По поводу ошибок, патчей, предложений по этому пакету пишите нам на [email protected].
| ОС | Поддерживаемые протоколы RPC | Требуемые открытые порты носителя | Возможные порты цели для сканирования |
|---|
| Windows 7 | EVEN,EVEN6 | 445 / 135 и TCP-порт even6 | 445* |
| Windows 8 | EVEN,EVEN6 | 445 / 135 и TCP-порт even6 | 445* |
| Windows 10 | EVEN,EVEN6,RPRN | 445 / 135 и TCP-порт even6 | ЛЮБОЙ |
| Server 2008 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 и TCP-порт even6 | 445 |
| Server 2012 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 и TCP-порт even6 | 445 |
| Server 2016 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 и TCP-порт even6 | 445 |
| Server 2019 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 и TCP-порт even6 | 445 |