
encuentra datos sensibles que se filtran de instancias de ServiceNow.
snowpick es un escáner de exposición de ServiceNow que detecta ACL de widgets mal configuradas, controles de acceso de la API REST y exposición de datos no autenticada.
ServiceNow expone datos a través de dos superficies públicas comunes: los widgets de Service Portal y la API REST de tablas. Cuando los controles de acceso en cualquiera de las dos superficies están mal configurados, los usuarios no autenticados pueden consultar registros internos como tickets de incidentes, directorios de usuarios, artículos de la base de conocimiento y elementos del catálogo de servicios. snowpick prueba ambas superficies, separa la exposición de filas de la evidencia de solo recuento y genera detalles de reproducción para una validación autorizada.
snowpick obtiene un token de sesión de la página de inicio de sesión de ServiceNow sin credenciales y lo usa para consultar las APIs internas de la plataforma. Comprueba dos superficies de ataque:
Widgets son pequeñas aplicaciones que impulsan el Service Portal de ServiceNow. Cada una tiene su propia configuración de control de acceso. Cuando esa configuración es demasiado permisiva, una sesión no autenticada puede recuperar datos del widget. snowpick primero solicita a la instancia una lista de widgets instalados cuando es posible, luego sondea cada uno y comprueba si devuelve registros o evidencia de solo recuento.
API de tablas es una interfaz REST en /api/now/table/ para consultar tablas de ServiceNow directamente. Tiene controles de acceso separados de los widgets, por lo que un objetivo puede estar restringido en una superficie y abierto en la otra. snowpick sondea tablas de alto valor como sys_user, incident y oauth_entity.
Oráculo de recuento. A veces un widget o tabla confirma que existen registros coincidentes sin devolver las filas. snowpick lo marca como count_oracle — no es una exposición completa, pero tampoco está limpio, ya que los recuentos pueden probarse con filtros para inferir datos a ciegas.
❯ go install github.com/BishopFox/snowpick@latest
O compilar desde el código fuente:
❯ git clone https://github.com/BishopFox/snowpick.git
❯ cd snowpick
❯ go build -o snowpick .
Requiere Go 1.21 o posterior.
Apunta snowpick a una instancia de ServiceNow. No se necesitan credenciales.
❯ 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 descubre automáticamente los widgets instalados en la instancia y sondea cada uno junto con sus valores predeterminados integrados. Los hallazgos se clasifican por severidad.
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
Pasa un archivo con un hostname por línea. snowpick los escanea en paralelo.
❯ 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 también expone una API REST de tablas en /api/now/table/ para consultar tablas backend directamente. Esta es una superficie de control de acceso separada de los widgets. Usa -table-api para comprobar ambas.
❯ 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
Para los hallazgos de la API de tablas, record_count representa el total de registros expuestos cuando ServiceNow devuelve un recuento total. sample_count muestra cuántos registros recopiló snowpick como evidencia acotada.
De forma predeterminada, snowpick comprueba un conjunto seleccionado de tablas de alto valor (tickets de incidentes, registros de usuarios, adjuntos, etc.). Con -discover, intenta enumerar los nombres de tablas de la instancia y también los comprueba.
❯ snowpick -target prod.service-now.com -discover -discover-limit 200
Usa -fingerprint para identificar qué versión de ServiceNow está ejecutando el objetivo. Esto ayuda a determinar qué parches de seguridad están aplicados.
❯ 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
Enruta el tráfico a través de Burp, ZAP o un proxy SOCKS. Usa -rate para limitar la velocidad de las solicitudes en instancias de producción.
❯ snowpick -target prod.service-now.com -proxy socks5://127.0.0.1:1080 -insecure -rate 200ms
Suprime la salida de progreso con -quiet. El JSON va a stdout por defecto, o a un archivo con -output. El código de salida 2 significa que existen hallazgos, 1 significa que uno o más objetivos no pudieron probarse y 0 significa que el escaneo se completó sin hallazgos.
❯ snowpick -target prod.service-now.com -quiet -output results.json
❯ echo $?
2