Explotación binaria: ¿Cómo configurar el GID de un binario SUID utilizando shellcode?

1

Tengo un binario que es SUID que actualmente puedo usar un exploit de desbordamiento de búfer para obtener un shell EUID elevado.

Sin embargo, no he trabajado mucho para cambiar las ID a través de shellcode, y el archivo al que necesito acceder requiere que tenga un GID igual al EUID que obtuve. Sin embargo, después de obtener mi shell, mi GID sigue siendo el mismo que anteriormente.

Mi pregunta: ¿Qué llamadas de sistema o código de shell necesito ejecutar para elevar mi GID para que sea igual a mi EUID cuando se genera el shell?

También: Hasta ahora he intentado setregid y setegid llamadas de sistema en shellcode antes de generar el shell, sin embargo, ambos devuelven "-1" cuando usa un GID que no es mi GID sin privilegios.

Gracias.

    
pregunta Sif 22.04.2018 - 18:42
fuente

1 respuesta

0

Según setgid(2) , la syscall fallará a menos que el proceso de llamada sea privilegiado:

   EPERM  The calling process is not privileged (does not have the
          CAP_SETGID capability), and gid does not match the real group
          ID or saved set-group-ID of the calling process.

A menos que se esté ejecutando con las capacidades correctas (específicamente, CAP_SETGID , siempre por root), no puede cambiar su GID a un valor que no sea su GID real o guardado. Esta limitación se aplica a cualquier syscall que cambie el GID. La página del manual en credentials(7) es extremadamente útil.

En realidad puede ver dónde se hace esto en el kernel :

SYSCALL_DEFINE1(setgid, gid_t, gid)
{
    struct user_namespace *ns = current_user_ns();
    const struct cred *old;
    struct cred *new;
    int retval;
    kgid_t kgid;

    kgid = make_kgid(ns, gid);
    if (!gid_valid(kgid))
        return -EINVAL;

    new = prepare_creds();
    if (!new)
        return -ENOMEM;
    old = current_cred();

    retval = -EPERM;
    if (ns_capable(old->user_ns, CAP_SETGID))
        new->gid = new->egid = new->sgid = new->fsgid = kgid;
    else if (gid_eq(kgid, old->gid) || gid_eq(kgid, old->sgid))
        new->egid = new->fsgid = kgid;
    else
        goto error;

    return commit_creds(new);

error:
    abort_creds(new);
    return retval;
}
    
respondido por el forest 23.04.2018 - 02:50
fuente

Lea otras preguntas en las etiquetas