Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-28326-check — Comprobador no destructivo del estado de parcheo para SolarWinds ARM CVE-2026-28326 que sondea el listener gRPC en TCP 55555 para informar VULNERABLE, PATCHED o INCONCLUSIVE. | Kitploit
Herramientas/GitHubGitHub/bishopfox/cve-2026-28326-check
Herramientas DefensivasEscáneres de VulnerabilidadesAnálisis de VulnerabilidadesRecopilación de InformaciónSeguridad de RedesPruebas de PenetraciónHerramienta de Acceso Remoto
GitHub

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
bishopfox/cve-2026-28326-check

CVE-2026-28326-check

Comprobador no destructivo del estado de parcheo para SolarWinds ARM CVE-2026-28326 que sondea el listener gRPC en TCP 55555 para informar VULNERABLE, PATCHED o INCONCLUSIVE.

Ver Repositorio
29hace 25 díasAún no revisado
Compartir

SolarWinds Access Rights Manager RCE no autenticado — Script de detección de vulnerabilidades

Una comprobación del estado de parcheo sin autenticación para CVE-2026-28326, la vulnerabilidad de ejecución remota de código sin autenticación en SolarWinds Access Rights Manager (ARM), corregida en ARM 2026.2.1 el 2026-09-17. CWE-798, CVSS 8.8 Alto (CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H). Reportado a SolarWinds por Kai Huang de Armadin. El AV:A en ese vector asume que TCP 55555 es accesible solo desde una red adyacente, que es la postura para la que están diseñadas las propias herramientas de firewall de ARM; donde el puerto se ha abierto de forma más amplia, la puntuación subestima la exposición para ese entorno.

El listener de remoting gRPC de ARM en TCP 55555 autentica a los pares con un certificado de cliente. Las compilaciones sin parchear también aceptan una credencial de respaldo derivada de una clave hardcodeada que es idéntica en todas las instalaciones, lo que omite esa autenticación y expone una ruta de deserialización insegura. El resultado es la ejecución de código como la cuenta de servicio de ARM, que se ejecuta como LocalSystem de forma predeterminada.

El script informa si la corrección está presente en cada objetivo. Lee los códigos de estado devueltos por el interceptor de autenticación y no utiliza la clave, no se autentica ni envía datos a la ruta de deserialización. Un resultado distinto de VULNERABLE no indica por sí mismo que un objetivo esté parcheado; consulte Interpretación de resultados no vulnerables.

Uso

# single target (port defaults to 55555)
./cve_2026_28326_check.py arm.example.com

# explicit port
./cve_2026_28326_check.py arm.example.com:55555

# several targets
./cve_2026_28326_check.py arm-a.example.com arm-b.example.com

# scan a list, one target per line ('#' comments allowed), compact output
./cve_2026_28326_check.py -f targets.txt --brief

# machine-readable output for pipelines
./cve_2026_28326_check.py -f targets.txt --json > results.json

Python 3.8+, solo biblioteca estándar — sin paquetes de terceros.

Ejecute la herramienta contra el servidor ARM en lugar de contra un colector. Ambos roles escuchan en 55555, pero un colector rechaza las solicitudes externas de la misma manera antes y después de la corrección, por lo que la herramienta lo reporta como INCONCLUSIVE.

Opciones

FlagDescripción
TARGETUno o más objetivos HOST[:PORT]; el puerto predeterminado es 55555
-f, --targets-file FILELee los objetivos desde un archivo (uno por línea; comentarios con #)
-p, --port PORTPuerto predeterminado cuando un objetivo omite uno (predeterminado: 55555)
--timeout SECSTiempo de espera por sonda (predeterminado: 12)
--workers NObjetivos concurrentes (predeterminado: 16); la salida mantiene el orden de entrada
-b, --briefUna sola línea alineada por objetivo, para escanear muchos hosts
--jsonEmite JSON estructurado, incluyendo ambas sondas por objetivo
--no-colorDesactiva la salida con color (también respeta NO_COLOR y entornos no TTY)

Ejemplos

Servidor vulnerable (salida predeterminada; el marcador [!] y VULNERABLE se muestran en rojo en una TTY):

$ ./cve_2026_28326_check.py arm.example.com
[!] arm.example.com:55555: VULNERABLE  [unavailable-on-server-role]
      Remoting/Send returned 14 UNAVAILABLE on a listener answering as the server role, the pre-patch rejection path (<= 2026.2.0.42)

Servidor parcheado. La compilación corregida devuelve un grpc-message, que la herramienta imprime junto al veredicto:

$ ./cve_2026_28326_check.py arm-dr.example.com
[+] arm-dr.example.com:55555: PATCHED  [unauthenticated-gate]
      Remoting/Send returned 16 UNAUTHENTICATED, the localhost and per-process-token gate introduced by the fix (>= 2026.2.1.7)
      grpc-message: Client certificate not found. Please register your application first.

Listener que no se puede clasificar. Un colector, o un servidor que rechaza solicitudes externas, responde a ambas sondas de la misma manera en cualquiera de las compilaciones:

$ ./cve_2026_28326_check.py collector.example.com
[?] collector.example.com:55555: INCONCLUSIVE  [external-requests-refused]
      the listener refuses external requests, which a collector role and a restricted server both do identically on either build; scan the ARM server itself

Múltiples objetivos con --brief:

$ ./cve_2026_28326_check.py -f targets.txt --brief; echo "exit: $?"
VULNERABLE    arm.example.com:55555            unavailable-on-server-role
PATCHED       arm-dr.example.com:55555         unauthenticated-gate
INCONCLUSIVE  collector.example.com:55555      external-requests-refused
UNAFFECTED    db.example.com:55555             not-arm
ERROR         offline.example.com:55555        unreachable
exit: 1

Salida JSON con --json. Se incluyen ambos resultados de sonda para que el veredicto pueda contrastarse con las respuestas sin procesar:

$ ./cve_2026_28326_check.py arm.example.com --json
[
  {
    "target": "arm.example.com:55555",
    "verdict": "VULNERABLE",
    "reason": "unavailable-on-server-role",
    "detail": "Remoting/Send returned 14 UNAVAILABLE on a listener answering as the server role, the pre-patch rejection path (<= 2026.2.0.42)",
    "grpc_message": "",
    "probes": [
      {
        "path": "/SolarWinds_ARM_GRPC_ConnectionAuthrization.ConnectionAuthorization/GetCertificate",
        "status": 0,
        "message": "",
        "alpn": "h2",
        "note": ""
      },
      {
        "path": "/SolarWinds_ARM_Remoting.Remoting/Send",
        "status": 14,
        "message": "",
        "alpn": "h2",
        "note": ""
      }
    ]
  }
]

¿Es seguro ejecutarlo?

La comprobación está pensada para usarse contra sistemas de producción:

  • No utiliza la clave hardcodeada ni presenta ninguna credencial. Observa cómo el servidor rechaza a un par anónimo, lo que depende de la compilación instalada.
  • No envía datos a la ruta de deserialización. La vulnerabilidad se desencadena mediante un objeto serializado en el cuerpo de un mensaje Remoting/Send. Ambas sondas envían un mensaje gRPC con un cuerpo de longitud cero, y el interceptor rechaza la llamada antes de que se despache ningún cuerpo de mensaje.
  • No modifica el estado del servidor. No se presenta ningún certificado de cliente, credencial ni sesión. La sonda GetCertificate envía un código de inscripción vacío, que el servidor rechaza antes de buscar o eliminar cualquier código pendiente, por lo que la sonda no consume un código de inscripción de un cliente que esté en pleno registro.
  • Abre dos conexiones TCP por objetivo, una por sonda, y cierra cada una tras leer el estado.

Huella de solicitudes y registros

#LlamadaPropósito
1ConnectionAuthorization/GetCertificateConfirma que el endpoint es ARM y está en el rol de servidor
2Remoting/SendLa sonda del estado de parcheo

En un servidor sin parchear, una solicitud anónima rechazada se registra a nivel de depuración (Unable to validate remote request token) y una línea informativa que nombra al par. Las compilaciones parcheadas registran un rechazo que nombra al par y la sugerencia de registro citada en el grpc-message anterior. Ninguna de las compilaciones registra una sesión.

Para buscar explotación en lugar de exposición, revise los registros NetworkConnectionEntry de ARM. Una entrada con IsAuthenticated=false y un ClientCertThumbPrint poblado es consistente con el bypass de autenticación y no ocurre en el tráfico normal.

Cómo funciona

Descargar herramienta