Binary Exploitation - Come impostare GID di un binario SUID usando lo shellcode?

1

Ho un binario SUID che posso utilizzare attualmente un exploit buffer overflow per ottenere una shell EUID elevata.

Tuttavia non ho lavorato molto con la modifica degli ID tramite shellcode, e il file che ho bisogno di accedere richiede di avere un GID uguale all'EUID che ho ottenuto. Tuttavia, dopo aver ottenuto la mia shell, il mio GID rimane lo stesso di prima.

La mia domanda: quali chiamate di sistema o shellcode devo eseguire per elevare il mio GID per essere uguale al mio EUID quando viene generata la shell?

Inoltre: finora ho provato le chiamate di sistema setregid e setegid nello shellcode prima di generare la shell, tuttavia entrambi restituiscono "-1" quando si utilizza un GID che non è già il mio GID non privilegiato.

Grazie.

    
posta Sif 22.04.2018 - 18:42
fonte

1 risposta

0

Secondo setgid(2) , syscall fallirà a meno che il processo chiamante non sia privilegiata:

   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 meno che tu stia utilizzando le capacità corrette (in particolare CAP_SETGID , fornito da root), non è possibile modificare il GID su un valore che non è il GID reale o salvato. Questa limitazione si applica a qualsiasi syscall che modifica il GID. La pagina di manuale su credentials(7) è estremamente utile.

In realtà puoi vedere dove è stato fatto nel 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;
}
    
risposta data 23.04.2018 - 02:50
fonte

Leggi altre domande sui tag