Perché io non riesco a creare socket di tipo raw in Ubuntu?

Sto imparando come lavorare con i raw socket in Linux. Sto cercando di creare un socket:

if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
    perror("socket() failed");
    exit(-1);
}

Ma tutto quello che ho ottenuto dopo il lancio è:

socket() failed: Operation not permitted

So che solo l’utente root può creare socket di tipo raw, ma se lo faccio funzionare con il bit SUID o sudo – i
il problema è lo stesso. Cosa c’è di sbagliato? Il sistema è Ubuntu 11.04.

Forse sono compresi inutile intestazioni?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>

E mi chiedo – perché SUID è inutile?

interessante; ha cercato di essere davvero root? (e verificata privilegi non vengono eliminati prima che l’esecuzione di tale linea?)
no, ho appena chiamata setuid(getuid()); a destra dopo la creazione del socket, ma non anche quella.
se volete fare: sudo bash (o sudo qualunque-shell-si-usa) e quindi si esegue il programma…? funziona?
Hmm, sì, funziona in questo modo. Ma perché suid è inutile?
Hai provato a fare seteuid — il bit setuid il programma non consente di impostare l’uid effettivo, e che potrebbe essere necessario impostare a livello di programmazione.

OriginaleL’autore Enchantner | 2011-07-26

3 Replies
  1. 13

    I miei soldi su di voi non è in esecuzione il codice correttamente.

    Ho copiato e incollato il tuo codice esatto, in un vuoto main(). Ottengo lo stesso errore se funziona come a me, ma non viene eseguito correttamente in sudo. Questo è su Ubuntu.

    Codice:

    #include <sys/socket.h>
    #include <netinet/in.h>
    
    int main()
    { 
      int sd;
      if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
        perror("socket() failed");
        return -1;
      }
      return 0;
    } 

    Esegui come me:

    [email protected]:~$ ./a.out 
    socket() failed: Operation not permitted
    [email protected]:~$

    Eseguire come root:

    [email protected]:~$ sudo ./a.out 
    [email protected]:~$
    Il tuo codice funziona perfettamente, troppo. Ma il mio codice è diverso dal tuo, solo le intestazioni. Ho incluso tutto il materiale (aggiunto in questione).
    quello che altri utenti possono fare per il real è configurabile, è possibile ubuntu 11 predefinito per sudoers, non è quello di dare un reale radice-powered utente?
    Mi ha salvato un bel po ‘ di tempo. Molto apprezzato NPE.

    OriginaleL’autore NPE

  2. 8

    secondo uomo: Solo i processi con un ID utente valido di 0 o il CAP_NET_RAW capacità sono permesso di aprire un socket di tipo raw

    Così è possibile eseguire l’applicazione con sudo come è stato suggerito di seguito o impostare CAP_NET_RAW capacità (in realtà avrete bisogno di CAP_NET_ADMIN troppo):

    # setcap cap_net_raw,cap_net_admin=eip PATH_TO_YOUR_APPLICATION

    Dettagli possono essere trovati al http://ftp.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.4/capfaq-0.2.txt

    fatto interessante, non sapeva…

    OriginaleL’autore tvn

  3. 0

    Intestazione non influenzano in alcun modo.

    Anche se sarebbe l’aggiunta di alcuni più file inutili che non influisce sul funzionamento del programma.

    OriginaleL’autore Manoj Rana

Lascia un commento