2020/03/31

Evitando sudo con capabilities

Tanto cuando te estás instalando herramientas de pentest como cuando alguien te pide en algún servidor que se las instales, surge el problema de los permisos, que antes se arreglaba dándole root a todo el mundo y luego mejoró, dándole sudo de un modo un poco menos indiscriminado.

Dejando de lado que tengo poca o nula experiencia configurando sudo, una de mis tantas tareas del backlog, hay muchas herramientas que no necesitan root para todas sus funciones si no para algunas muy específicas.

En el caso de pentest suele tener que ver con acceso a la red, ya sea para enviar paquetes arbitrarios salteándose las restricciones que imponen las interfaces o accediendo a la interfaz de red directamente para ver el tráfico.

Las herramientas más comunes para estos escenarios son nmap y tcpdump correspondientemente.

Existe un riesgo adicional el ejecutar estas aplicaciones con permisos adminstrativos y es que siendo aplicaciones complejas no carecen de bugs y se pueden convertir en puntos de entrada para tomar el control de tu máquina, si sos un usuario común el ataque queda más contenido que si sos root, donde el éxito lleva al control total, a menos que tengas SELinux, que es mucho más complicado y me pesa tambien no saber, cuando sea grande aprenderé SELinux.

Lo que sí sé de SELinux es que parece que es más apropiado para ambientes poco cambiantes tipo servidores, no para estaciones de trabajo.

La idea entonces es otorgar permisos granulares o capacidades a un programa tal que pueda hacer cosas reservadas a root sin ser root y ajustar los permisos de modo tal que sólo los usuarios pertenencientes a un grupo puedan ejecutarlo, manos a la obra.



Crear un grupo

$ addgroup networkaudit


Identificar los programas:

$ which nmap
/usr/bin/nmap

$ which tcpdump
/usr/sbin/tcpdump


Cambiarles el grupo:

$ chgrp networkaudit /usr/bin/nmap
$ chgrp networkaudit /usr/sbin/tcpdump


Medida extra, cambiarle los permisos:

$ chmod 750 /usr/bin/nmap
$ chmod 750 /usr/sbin/tcpdump


Setear las capabilities:


$ setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
$ setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip  \
    /usr/bin/nmap

nmap en particular necesita que lo ejecutes luego con --privileged pues como está preparado para tomar caminos alternativos si no sos root, te dice que no tenés permisos sin intentar hacerlo.

También podés poner en .profile

export NMAP_PRIVILEGED=""



wireshark te ofrece acomodar todo el instalar, pero puede ser que te olvides:






Asi que cuando ejecutes y quieras capturar te va a decir que no y cómo solucionarlo.




$ sudo dpkg-reconfigure wireshark-common

Luego, para cada usuario:

$ sudo usermod -a -G wireshark $user


Tras ejecutar las instrucciones, veamos a quien tocó:


$ getcap $( which wireshark )

nada... ok, es razonable, wireshark es un animal bastante grande, quizas hay un componente, si le preguntamos a synaptic...





...podés copiar y pegar:

$ cat << EOF | while read file; do getcap "$file"; done
> /usr/bin/capinfos
> /usr/bin/captype
> /usr/bin/dumpcap
> /usr/bin/editcap
> /usr/bin/mergecap
> /usr/bin/mmdbresolve
> /usr/bin/randpkt
> /usr/bin/rawshark
> /usr/bin/reordercap
> /usr/bin/text2pcap
> EOF


O menos chancho, le preguntas a dpkg


$ dpkg -L wireshark-common | grep bin | while read file; do \
   getcap "$file"; done


En ambos caso te trae

/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Con lo cual te podés arreglar con:

$ setcap cap_net_admin,cap_net_raw+eip /usr/bin/dumpcap




Esto ha sido para networking, pero puede ser útil para otros contextos.

Me he servido de man capabilities y al menos:

https://peternixon.net/news/2012/01/28/configure-tcpdump-work-non-root-user-opensuse-using-file-system-capabilities/


https://diego.assencio.com/?index=e48aa7b74bd7acb76c30de0a240108c2

No hay comentarios:

Publicar un comentario