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.

··Feeds·Contacto·Privacidad·© 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
hace 4 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

root@kitploit:~
# 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):

root@kitploit:~
$ ./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:

root@kitploit:~
$ ./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:

root@kitploit:~
$ ./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:

root@kitploit:~
$ ./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:

root@kitploit:~
$ ./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

La corrección cambió qué estado devuelve el interceptor de autenticación a un par que no presenta certificado de cliente. Antes del parche, todas las rutas de rechazo en la comprobación del certificado de cliente establecían Unavailable. Después del parche, la comprobación de localhost-más-token establece Unauthenticated con un mensaje distintivo, y nada más en esa ruta devuelve 16. Dos llamadas anónimas distinguen las compilaciones:

Remoting/SendGetCertificateCompilaciónVeredicto
14 UNAVAILABLE0 OK<= 2026.2.0.42VULNERABLE
16 UNAUTHENTICATEDcualquiera>= 2026.2.1.7PATCHED
14 UNAVAILABLE14 UNAVAILABLEcualquieraINCONCLUSIVE

El veredicto se lee de Remoting/Send porque solo los manejadores de flujo dúplex y unario propagan el estado del interceptor; los manejadores de flujo de servidor y de cliente lo sobrescriben en ambas compilaciones.

Informa el estado de parcheo, no una versión

La comprobación observa el comportamiento de la ruta de código parcheada y no se basa en una cadena de versión. No informa qué compilación está ejecutando un servidor parcheado.

Se requiere ALPN

El listener de ARM restablece las conexiones TLS que no negocian ALPN h2, por lo que la herramienta lo establece explícitamente. Un escáner que se conecta por TLS sin ALPN no recibe datos del puerto.

Interpretación de resultados no vulnerables

VULNERABLE y PATCHED se basan cada uno en una respuesta observada del servidor. INCONCLUSIVE y ERROR significan que las sondas no clasificaron el objetivo, por lo que su estado de parcheo es desconocido. Por este motivo, INCONCLUSIVE se informa por separado de PATCHED.

Veredictos

Cada veredicto lleva una etiqueta reason corta. --brief la imprime como tercera columna y --json la incluye como reason.

VeredictoEtiqueta de motivoSignificado
VULNERABLEunavailable-on-server-roleRemoting/Send devolvió 14 en un listener que responde a GetCertificate como el rol de servidor. La corrección no está presente.
PATCHEDunauthenticated-gateRemoting/Send devolvió 16, el estado introducido por la corrección. Aplica solo a este CVE.
INCONCLUSIVEexternal-requests-refusedAmbas sondas devolvieron 14. Un rol de colector y un servidor restringido se comportan de forma idéntica aquí en ambas compilaciones. Escanee el propio servidor ARM.
INCONCLUSIVEpartial-responseSolo una sonda devolvió un estado, por lo que el par no se puede comparar. Reintente.
INCONCLUSIVEunrecognized-statusEl endpoint respondió con una combinación de estados fuera del conjunto reconocido.
UNAFFECTEDnot-armNingún servicio gRPC de ARM respondió aquí.
ERRORunreachableFalló la conexión TCP, el handshake TLS o el intercambio HTTP/2.

Para los tres motivos de INCONCLUSIVE el estado de parcheo es desconocido. La etiqueta de motivo indica qué hay que resolver antes de ejecutar la comprobación de nuevo.

Códigos de salida

CódigoSignificado
0Ningún objetivo era VULNERABLE
1Al menos un objetivo es VULNERABLE
2Error de uso (argumentos incorrectos, objetivo no válido o archivo de objetivos ilegible)
130Interrumpido (Ctrl-C)

El código de salida 0 abarca PATCHED, UNAFFECTED y los tres motivos de INCONCLUSIVE. Para distinguir un objetivo parcheado de uno que no se pudo clasificar, lea el veredicto (la primera columna de --brief o el campo verdict de --json) en lugar del código de salida.

Limitaciones

  • Rol de colector: un colector responde a ambas sondas con 14 en cualquiera de las compilaciones y se informa como INCONCLUSIVE. Este caso se probó contra un mock que reproduce la respuesta, no contra un colector desplegado.
  • Análisis de encabezados: la herramienta busca grpc-status como un campo HPACK literal y no implementa decodificación Huffman ni de tabla dinámica. El núcleo C de gRPC, que ARM utiliza, envía estos trailers sin comprimir. Si una compilación futura los codifica con Huffman, la herramienta informa INCONCLUSIVE con partial-response.
  • Alcance: PATCHED aplica solo a este CVE y no indica el estado de otras vulnerabilidades de ARM.
  • Explotación y compromiso: VULNERABLE indica que la corrección no está presente en la ruta que alcanzó la sonda. La herramienta no ejecuta código en el objetivo ni detecta un compromiso previo; consulte el indicador NetworkConnectionEntry anterior.
  • Alcanzabilidad: los resultados reflejan lo que el servidor expone a la ubicación de red desde la que se ejecuta la herramienta. En una instalación predeterminada, TCP 55555 escucha en todas las interfaces, incluida IPv6.

Remediación

Actualice a ARM 2026.2.1.7 o posterior, según las notas de la versión ARM 2026.2.1. Las compilaciones 2026.2.0.42 y anteriores están afectadas.

Notas adicionales:

  • Restrinja TCP 55555 a los propios colectores y clientes de ARM. Esto limita la exposición en sistemas que no se pueden parchear de inmediato.
  • La corrección elimina la ruta de autenticación de respaldo; no rota la clave. Dado que la clave era la misma en todas las instalaciones, trate cualquier período anterior al parcheo como uno en el que la autenticación del listener podía ser omitida por cualquiera capaz de alcanzarlo.
  • Un inventario de versiones muestra qué debería estar instalado; esta comprobación muestra si la corrección está en efecto en el listener.

Licencia

Este código se distribuye bajo una licencia MIT.

Aviso legal

El uso de esta herramienta para atacar objetivos sin consentimiento mutuo previo es ilegal. Es responsabilidad del usuario final cumplir con todas las leyes locales, estatales y federales aplicables. Los desarrolladores no asumen ninguna responsabilidad y no son responsables de ningún mal uso o daño causado por este programa.

Véase también

  • Notas de la versión de SolarWinds ARM 2026.2.1
  • NVD — CVE-2026-28326
Descargar herramienta