
Находит утечки конфиденциальных данных из экземпляров ServiceNow.
snowpick — это сканер раскрытия данных ServiceNow, который находит некорректно настроенные ACL виджетов, ошибки контроля доступа REST API и неаутентифицированное раскрытие данных.
ServiceNow раскрывает данные через две распространённые публичные поверхности: виджеты Service Portal и Table REST API. Если контроль доступа на любой из этих поверхностей настроен некорректно, неаутентифицированные пользователи могут запрашивать внутренние записи, такие как тикеты инцидентов, каталоги пользователей, статьи базы знаний и элементы сервисного каталога. snowpick проверяет обе поверхности, различает раскрытие записей и подтверждение только по количеству, а также формирует детали воспроизведения для авторизованной валидации.
snowpick получает сессионный токен со страницы входа ServiceNow без каких-либо учётных данных, а затем использует его для запросов к внутренним API платформы. Он проверяет две поверхности атаки:
Виджеты — это небольшие приложения, на которых работает ServiceNow Service Portal. У каждого из них собственные настройки контроля доступа. Когда эти настройки слишком разрешительные, неаутентифицированная сессия может получать данные из виджета. snowpick сначала запрашивает у инстанса список установленных виджетов, где это возможно, затем проверяет каждый из них и определяет, возвращает ли он записи или только их количество.
Table API — это REST-интерфейс по адресу /api/now/table/ для прямого запроса таблиц ServiceNow. Контроль доступа у него отдельный от виджетов, поэтому цель может быть закрыта на одной поверхности и открыта на другой. snowpick проверяет ценные таблицы, такие как sys_user, incident и oauth_entity.
Оракул подсчёта. Иногда виджет или таблица подтверждает, что подходящие записи существуют, но не возвращает сами строки. snowpick помечает это как count_oracle — не полное раскрытие, но и не чисто, поскольку через фильтры можно опрашивать счётчики и вслепую делать выводы о данных.
❯ go install github.com/BishopFox/snowpick@latest
Или соберите из исходного кода:
❯ git clone https://github.com/BishopFox/snowpick.git
❯ cd snowpick
❯ go build -o snowpick .
Требуется Go 1.21 или новее.
Направьте snowpick на инстанс ServiceNow. Учётные данные не требуются.
❯ snowpick -target prod.service-now.com
snowpick v1.0.0 | 1 targets | 6 widgets | proxy direct
[!] prod.service-now.com
| ticket-attachments 272 records [internal_operations:inferred]
[*] 1/1 targets complete, 1 with findings
RESULTS
1 targets scanned in 8.2s | 1 reachable | 1 with findings
EXPOSED prod.service-now.com 272 records [internal_operations:inferred]
| ticket-attachments 272 records [internal_operations:inferred]
| ServiceNow Overview and Open House 'How To.... Videos'
| How to - JIRA and Confluence Access Process
| Updating Your Personal Time Zone in ServiceNow
ATTACK SURFACE
ticket-attachments #################### 272 across 1 target
DATA CLASSIFICATION
OPERATIONS 1 finding across 1 target
snowpick автоматически обнаруживает виджеты, установленные на инстансе, и проверяет каждый из них наряду со встроенными наборами по умолчанию. Находки ранжируются по критичности.
Progress markers (left of each host):
[!] findings [+] clean [-] unreachable or no session [*] progress
Summary buckets:
EXPOSED data or a confirmed count came back CLEAN nothing reachable
SKIP no public session (e.g. SSO-only login) DOWN host unreachable
Counts:
272 records total the instance reports as matching
272 records, 10 sampled total, plus the rows snowpick pulled as evidence
Tags:
[pii:observed] a hint, written as category:basis
basis observed = value seen in returned data
inferred = from a table/field/widget name
category pii, credentials, infrastructure,
internal_operations, review_required
[blind oracle] count confirmed but no rows returned (a count_oracle)
[API] finding came from the Table REST API, not a widget
[stats.do] the /stats.do diagnostic endpoint is publicly reachable
Передайте файл с одним hostname на строку. snowpick сканирует их параллельно.
❯ snowpick -targets hosts.txt -concurrency 5
snowpick v1.0.0 | 6 targets | 6 widgets | proxy direct
[!] prod.service-now.com
| ticket-attachments 272 records [internal_operations:inferred]
[*] 1/6 targets complete, 1 with findings
[+] staging.service-now.com clean
[*] 2/6 targets complete, 1 with findings
[!] dev.service-now.com [stats.do]
| ticket-attachments 61 records [internal_operations:inferred]
[*] 3/6 targets complete, 2 with findings
[+] sandbox.service-now.com clean
[*] 4/6 targets complete, 2 with findings
[-] internal.service-now.com bootstrap failed: /login.do returned 302
[+] test.service-now.com clean
[*] 6/6 targets complete, 2 with findings
ServiceNow также предоставляет Table REST API по адресу /api/now/table/ для прямого запроса внутренних таблиц. Это отдельная от виджетов поверхность контроля доступа. Используйте -table-api, чтобы проверить обе.
❯ snowpick -target prod.service-now.com -table-api
snowpick v1.0.0 | 1 targets | 6 widgets | proxy direct
[!] prod.service-now.com
| [API] cmn_department 1,234 records, 10 sampled [infrastructure:inferred]
[*] 1/1 targets complete, 1 with findings
Для находок Table API record_count показывает общее количество раскрытых записей, когда ServiceNow возвращает итоговое число. sample_count показывает, сколько записей snowpick собрал в качестве ограниченного доказательства.
По умолчанию snowpick проверяет подобранный набор ценных таблиц (инциденты, записи пользователей, вложения и т. д.). С флагом -discover он пытается перечислить имена таблиц из инстанса и проверить их тоже.
❯ snowpick -target prod.service-now.com -discover -discover-limit 200
Используйте -fingerprint, чтобы определить, какой релиз ServiceNow запущен на цели. Это помогает понять, какие патчи безопасности установлены.
❯ snowpick -target prod.service-now.com -fingerprint
snowpick v1.0.0 | 1 targets | 6 widgets | proxy direct
[!] prod.service-now.com [Zurich (glide-zurich-07-01-2025__patch7-02-19-2026)] [stats.do]
| ticket-attachments 61 records [internal_operations:inferred]
[*] 1/1 targets complete, 1 with findings
Пропускайте трафик через Burp, ZAP или SOCKS-прокси. Используйте -rate, чтобы ограничить частоту запросов к боевым инстансам.
❯ snowpick -target prod.service-now.com -proxy socks5://127.0.0.1:1080 -insecure -rate 200ms
Подавите вывод прогресса с помощью -quiet. JSON по умолчанию выводится в stdout или в файл с -output. Код выхода 2 означает, что есть находки, 1 — одну или несколько целей не удалось проверить, 0 — сканирование завершилось без находок.
❯ snowpick -target prod.service-now.com -quiet -output results.json
❯ echo $?
2
JSON-вывод содержит детали находок, включая подсказки о влиянии, детали запросов, ограниченные образцы записей, когда строки возвращаются, и материалы для воспроизведения, где это применимо.