Не удалось прогрузить медиа
Простите, не дружу с фотошопом
Вступление
Всем привет, с вами как всегда YmbMember. Сегодняшнюю сборку статей (3 части) я бы хотел посвятить анализу JS файлов. В этой статье мы с вами научимся правильно собирать .js файлы и проводить базовый анализ, при каком вы уже сможете найти баги и получить достаточно интересной информации. В следующих сериях мы научимся анализировать JS файлы от А до Я, находить серьезные уязвимости и поговорим о других немаловажных вещах
Спойлер: Дисклеймер
Дисклеймер:
Всё представленное в материале тестирование проводилось на заказанном сайте и с согласия его владельцев.
Цель — демонстрация методик безопасного анализа и повышения уровня защиты веб-ресурсов.
Автор не поощряет и не призывает к каким-либо незаконным действиям, несанкционированному тестированию или взлому сайтов.
Используйте полученные знания исключительно в легальных целях и в рамках ответственного раскрытия уязвимостей
Всё представленное в материале тестирование проводилось на заказанном сайте и с согласия его владельцев.
Цель — демонстрация методик безопасного анализа и повышения уровня защиты веб-ресурсов.
Автор не поощряет и не призывает к каким-либо незаконным действиям, несанкционированному тестированию или взлому сайтов.
Используйте полученные знания исключительно в легальных целях и в рамках ответственного раскрытия уязвимостей
Зачем же это нужно?
Иногда я пишу каким-то топовым баг хантерам. И все они советовали мне заняться хотя бы минимальным реверсом JS файлов. Почти все они при поиске уязвимостей анализируют .js файлы для большего понимания работы веб приложения. Мало того, у некоторых своя методология анализа JS при реконе.
Как всем известно, в веб-приложении HTML и CSS — это тело и внешний вид. JS же придаёт жизни телу, то есть органы: анимации, работа с параметрами и т. д. — всё это его заслуга.
При помощи анализа JS файлов можно понять логику работы веб приложения, технологии используемые веб приложениями, найти скрытые эндпоинты, параметры, секреты и не только
Этап 1: сбор
Для того чтобы проанализировать что-то, надо получить то что будем анализировать
- Waymore
Не удалось прогрузить медиа
Waymore - это скрипт, какой поможет собрать ссылки из следующих источников:
- Wayback Machine (web.archive.org)
- Common Crawl (index.commoncrawl.org)
- Alien Vault OTX (otx.alienvault.com)
- URLScan (urlscan.io)
- Virus Total (virustotal.com)
- Intelligence X (intelx.io) - платно
Code:
FILTER_CODE: 404,301,302
FILTER_MIME: text/css,image/jpeg,image/jpg,image/png,image/svg+xml,image/gif,image/tiff,image/webp,image/bmp,image/vnd,image/x-icon,image/vnd.microsoft.icon,font/ttf,font/woff,font/woff2,font/x-woff2,font/x-woff,font/otf,audio/mpeg,audio/wav,audio/webm,audio/aac,audio/ogg,audio/wav,audio/webm,video/mp4,video/mpeg,video/webm,video/ogg,video/mp2t,video/webm,video/x-msvideo,video/x-flv,application/font-woff,application/font-woff2,application/x-font-woff,application/x-font-woff2,application/vnd.ms-fontobject,application/font-sfnt,application/vnd.android.package-archive,binary/octet-stream,application/octet-stream,application/pdf,application/x-font-ttf,application/x-font-otf,video/webm,video/3gpp,application/font-ttf,audio/mp3,audio/x-wav,image/pjpeg,audio/basic,application/font-otf,application/x-ms-application,application/x-msdownload,video/x-ms-wmv,image/x-png,video/quicktime,image/x-ms-bmp,font/opentype,application/x-font-opentype,application/x-woff,audio/aiff
FILTER_URL: .css,.jpg,.jpeg,.png,.svg,.img,.gif,.mp4,.flv,.ogv,.webm,.webp,.mov,.mp3,.m4a,.m4p,.scss,.tif,.tiff,.ttf,.otf,.woff,.woff2,.bmp,.ico,.eot,.htc,.rtf,.swf,.image,/image,/img,/css,/wp-json,/wp-content,/wp-includes,/theme,/audio,/captcha,/font,node_modules,/jquery,/bootstrap
FILTER_KEYWORDS: admin,login,logon,signin,signup,register,registration,dash,portal,ftp,panel,.js,api,robots.txt,graph,gql,config,backup,debug,db,database,git,cgi-bin,swagger,zip,.rar,tar.gz,internal,jira,jenkins,confluence,atlassian,okta,corp,upload,delete,email,sql,create,edit,test,temp,cache,wsdl,log,payment,setting,mail,file,redirect,chat,billing,doc,trace,ftp,gateway,import,proxy,dev,stage,stg,uat,sonar.ci.,.cp.
URLSCAN_API_KEY:
VIRUSTOTAL_API_KEY:
CONTINUE_RESPONSES_IF_PIPED: True
WEBHOOK_DISCORD: YOUR_WEBHOOK
DEFAULT_OUTPUT_DIR:
INTELX_API_KEY:
После заполнения конфиг файла собираем ссылки:
waymore -i https://таргет -mode U --no-subs -oU waymoreoutput
Для наших целей тут будет много мусора, поэтому среди всех ссылок достанем .JS файлы
cat waymoreoutput | grep -E '\.js([?#].*)?$' > waymorejsfiles
Избавимся от всяких 404 и 403:
cat waymorejsfiles| httpx-toolkit -mc 200 -o waymorejsfiles1
Теперь в файле waymorejsfiles1 у нас лежат все актуальные .js файлы какие знает waymore. Двигаемся дальше
- katana
Не удалось прогрузить медиа
katana - очень мощный и гибкий веб краулер от projectdiscovery (разрабов nuclei)
katana -u "таргет" -aff --depth=5 -jc -jsl -kf all -cs ".+" -retry 2 --timeout 15 -fx -fs fqdn –output katana.txt
[ВАЖНО] повторяю в каждой статье! Лучше проксируйте траффик чтобы смотреть что творится через бурп сьют --proxy=http://127.0.0.1:8080
cat katana.txt | grep -E '\.js([?#].*)?$' > katanajsfiles
- Фаззинг через ffuf
Не удалось прогрузить медиа
Это папки
/bitrix/js/pull/protobuf/
/bitrix/js/rest/client/
/bitrix/js/main/
/bitrix/js/aspro.max/
/bitrix/js/currency/currency-core/dist/
/bitrix/js/currency/
Исходя из названий путей, тут уже несложно догадаться что наш испытуемый сделан на 1С Битрикс. Поэтому для более эффективного результата ищем в интернете по каким путям хранятся файлы в битриксе. После этого в каждом пути выполняем перебор
ffuf -u https://www.site.com/js/FUZZ -w (словрь. Скачать https://wordlists-cdn.assetnote.io/data/automated/httparchive_js_2025_10_27.txt) -mc 200-299,301,302,307 <дальше аргументы на свой вкус и цвет>
Не удалось прогрузить медиа
В рамках этой статьи я не буду использовать этот метод, т.к я уже знаю что на этом таргете для меня FFUF ничего интересного не найдет. Но вы не ленитесь! Обязательно делайте!
После этих 3х этапов мы можем сохранить все ссылки в 1 файл без дубликатов и прочей грязи
cat katanajsfiles waymorejsfiles1 файл_с_ffuf | uniq > js_links.txt
Из личного любопытства я захотел узнать какой инструмент справился лучше всего
Не удалось прогрузить медиа
Результаты видите сами
Дополнение: другие методы сбора
Эти методы сбора добавлены в отдельную главу, т.к их вы будете использовать при основном тестировании сайта (фаза после разведки). После того как вы закончите фазу тестирования, проанализируете новые файлы еще раз. Хотел бы подметить, что эти методы сбора самые эффективные и я бы не советовал их скипать
- Расширение от lazyegg
Не удалось прогрузить медиа
Это расширение поможет вам собрать js файлы в режиме реального времени.
Суть проста - при переходе на новую страницу тыкаете на расширение и качаете собранные ссылки. Никакой катана краулер НЕ ЗАМЕНИТ живой серфинг сайта и вы должны это понимать.
Если при загрузке расширения вас тревожит ошибка связанная с версией манифеста, вот вам обновленная версия манифеста:
Code:
{
"manifest_version": 3,
"name": "Lazy Egg JS URL Exfiltrator",
"version": "1.0",
"description": "le Lazy Egg",
"permissions": ["tabs", "activeTab", "storage"],
"host_permissions": ["<all_urls>"],
"background": {
"service_worker": "background.js"
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["lazyegg.js"],
"run_at": "document_start"
}
],
"action": {
"default_title": "Lazy Egg",
"default_popup": "tinkerbell.html"
},
"web_accessible_resources": [
{
"resources": ["lazyegg-injected.js"],
"matches": ["<all_urls>"]
}
]
}
- BurpJsLinkFinder
Не удалось прогрузить медиа
Скрипт нам сам генерирует удобный лог файл, какой можно сохранить. Но я уверен, что вам понадобится получить с него эндпоинты и .js файлы отдельно. Для этого я написал свой скрипт
Не удалось прогрузить медиа
Code:
import re
import argparse
def extract_js_links(text):
js_links = []
pattern = r'\[\+] Valid URL found: (https?://[^\s]+?\.js(?:\?.*?)?)'
matches = re.findall(pattern, text)
for match in matches:
clean_link = match.split('?')[0]
js_links.append(clean_link)
return js_links
def extract_endpoints(text):
endpoints = []
lines = text.split('\n')
for line in lines:
if re.match(r'^\s*\d+ - ', line):
endpoint = re.sub(r'^\s*\d+ - ', '', line).strip()
endpoints.append(endpoint)
return endpoints
parser = argparse.ArgumentParser(description='Extract JS links and endpoints from a file.')
parser.add_argument('-i', '--input', required=True, help='Input file containing the content to process.')
args = parser.parse_args()
with open(args.input, 'r', encoding='utf-8') as file:
content = file.read()
js_links = extract_js_links(content)
endpoints = extract_endpoints(content)
js_output_file = 'js_links.txt'
endpoints_output_file = 'endpoints.txt'
with open(js_output_file, 'w', encoding='utf-8') as f:
for link in js_links:
f.write(link + '\n')
with open(endpoints_output_file, 'w', encoding='utf-8') as f:
for ep in endpoints:
f.write(ep + '\n')
print(r"""
__ __ _ __ __ _
\ \ / / | | | \/ | | |
\ \_/ / __ ___ | |__ | \ / | ___ _ __ ___ | |__ ___ _ __
\ / '_ ` _ \| '_ \| |\/| |/ _ \ '_ ` _ \| '_ \ / _ \ '__|
| || | | | | | |_) | | | | __/ | | | | | |_) | __/ |
|_||_| |_| |_|_.__/|_| |_|\___|_| |_| |_|_.__/ \___|_|
Представляю форум LIMB.cc
Скрипт сделан для статьи
""")
print(f"Extracted {len(js_links)} JS links and exported to {js_output_file}")
print(f"Extracted {len(endpoints)} endpoints and exported to {endpoints_output_file}")
Данный скрипт с лог файла вытаскивает отдельно все найденные .js и эндпоинты
Этап 2: Начинаем анализировать
- Узнаем технологии
Code:
Вот список .js-файлов, используемых на сайте (файл прикрепил)
Проанализируй этот список и подготовь отчёт в структурированном формате. Учти следующие аспекты:
а) Технологии веб-приложения
На основе анализа названий файлов и их путей определи, на каких технологиях, фреймворках или библиотеках может работать это веб-приложение. Приведи обоснования для каждого вывода (например, наличие "react" может указывать на React.js).
б) Возможные уязвимости
На основе названий и путей файлов укажи, на какие потенциальные уязвимости или риски безопасности могут намекать эти файлы. Обоснуй свои предположения (например, устаревшие версии библиотек могут быть подвержены известным CVE). Не давай инструкций по эксплуатации, только анализ.
в) Рекомендации для ручного анализа
Перечисли, какие .js-файлы стоит проанализировать вручную bug bounty hunter'у. Обоснуй выбор (например, файлы с кастомным кодом или подозрительными именами, которые могут содержать логику аутентификации).
г) отталкиваясь от того что ты проанализировал, сгенерируй быстрый чек-лист (что искать в каждом JS при ручном ревью)
Прикрепляем js_links.txt с этим запросом и модель вам покажет какие технологии на таргете по названиям она обнаружила и что интересного можно с этим сделать. Дает уж очень большие репорты, так что я закину небольшой кусочек
Не удалось прогрузить медиа
Двигаем дальше
- Сбор эндпоинтов
Code:
cat /путь/к/js_links.txt | xargs -I @ bash -c 'echo -e "\n[URL] @\n"; python3 linkfinder.py -i @ -o cli' | tee WithUrl.txt
Не удалось прогрузить медиа
Вот так просто получить список всех эндпоинтов, какие лежат в .js файлах.
Т.к я пентещу веб приложение на битриксе, в результате 95% всего что можно увидеть это базовые модули, какие идут с коробки. Я хотел поискать среди них кастомные, но увы их не было. Ну или я просто не заметил
В каком-то кастомном .js файе был лежал путь к уязвимому модулю map.google.view, какой лежал по пути /trash :/
Видимо они знали, что модуль уязвим, и дабы прикрыть его просто поместили в папку /trash. Интересно
Не удалось прогрузить медиа
Честно, я про такие приколы ещё не слышал
Не удалось прогрузить медиа
Вот такой он интересный бывает .js рекон. Просто так от любого участника LIMB ничего не скрыть!
Мы сохранили результат с linkfinder в файл WithUrl.txt. Если вам лень вы можете анализировать его вот так:
Не удалось прогрузить медиа
Но лучше сделать как я - проанализировать все в ручную.
Но анализировать когда все в куче - неудобно. Если подумать, linkfinder нам дает не только список эндпоинтов на таргете. С этого всего можно достать следующую информацию:
- Внешние ссылки
- Параметры
- Пути
- Названия файлов
Чтобы достать это все, может воспользоваться скриптом collector.py
https://raw.githubusercontent.com/m4ll0k/BBTz/refs/heads/master/collector.py. Он нам поможет привести все результаты в красивый вид
cat WithUrl.txt | python3 collector.py "output". Результаты будут выведены в папку output
Не удалось прогрузить медиа
Теперь в файлах files.txt js.txt params.txt paths.txt urls.txt у нас лежит вся информация, анализируем спокойно. Если не хотите - можете скормить LLM модели
Заключение
Сегодня мы узнали, как правильно собирать .js файлы с таргета и как выполнять самый базовый анализ. Но даже он может принести свои плоды. В следующий части мы поговорим о довольно подробном и долгом анализе, какой нам принесет еще больше сочных багов
Вывод: не ленитесь делать рекон. 30% найденных багов придут к вам благодаря качественной разведке
👍45
❤️9
🔥4
😮12
🤔6
LIMB