1 votos

¿Cómo arreglar el error "Socket creation in UltraProbe...Permission denied" al usar nmap?

Tengo una versión precompilada de nmap binario para Android que funcionaba correctamente y sin errores en LineageOS 14.1. El teléfono es un One Plus One.

Desde que actualicé a Lineage 15.1 (Android 8), el error específico que obtengo es:

Socket creation in UltraProbe* sendConnectScanProbe(UltraScanInfo, HostScanStats, u16, u8, u8): Permission denied (13).

Esto es cuando nmap se ejecuta como usuario estándar, como Root el teléfono deja de responder y se bloquea inmediatamente. Leí en algún sitio en SO que alguien que también intentaba abrir un socket se encontraba con un problema de permisos también, pero lo sorteó con éxito añadiendo el usuario a estos grupos: aid_bt , aid_bt_net , aid_inet , aid_net_raw , aid_admin

No parece que esta versión de LineageOS tenga tampoco groupadd o usermod , por lo que esa solución no me sirve.

¿Se ha producido algún cambio entre las dos versiones de Lineage que pueda causar este problema?
¿Y cómo puedo hacer nmap ¿trabajar de nuevo?

2voto

Jack Wade Puntos 231

¿Se ha producido algún cambio entre las dos versiones de Lineage que pueda causar este problema?

No tengo ninguna experiencia con nmap y no puede estar seguro de por qué funcionó con Android N, pero Android siempre ha sido restrictivo en lo que respecta al acceso al socket. He estado enfrentando los mismos problemas al menos desde Marshmallow y en adelante. ping es el ejemplo común.

No parece que esta versión de LineageOS tenga tampoco  groupadd  o  usermod

Android's usuarios y permisos La gestión es muy diferente a la de Linux. Bionic libc no admite muchas de las llamadas sicológicas proporcionadas por el estándar glibc En particular, en lo que se refiere a NSS . Además, los archivos relacionados /etc/passwd , /etc/group , /etc/shadow y otros no existen en Android como existen en Linux. Por lo tanto, las utilidades estándar de Linux groupadd y useradd etc. no pueden utilizarse en Android a menos que se modifique la fuente y el entorno en consecuencia.

¿cómo puedo hacer que nmap vuelva a funcionar?

Si desea utilizar un program compilado para Linux estándar que necesita capacidades CAP_NET_BIND_SERVICE , CAP_NET_ADMIN , CAP_NET_RAW etc., el programa debe ser ejecutado por un usuario que sea miembro de los grupos de Android aid_inet , aid_admin y aid_net_raw . Aunque el root usuario tiene aparentemente CAP_NET_* capacidades, Llamada al sistema de sockets falla si no se añade a estos grupos explícitamente. La mayoría de las veces sólo aid_inet es suficiente.

Por ejemplo, veamos las capacidades de wpa_supplicant (proceso responsable de realizar las conexiones wi-fi) en Android:

~$ su -c "getpcaps $(pidof wpa_supplicant)"
Capabilities for `21224': = cap_net_admin,cap_net_raw+ep

Así que, nmap no funcionará si no se ejecuta con sus capacidades requeridas. Una capacidad es un subconjunto de permisos Root.

Las aplicaciones de terminal suelen ser ya miembros de aid_net grupo ( android.permission.INTERNET ). Sin embargo, si no es el caso o quieres crear un usuario tipo Linux en Android, sigue adelante.

AÑADIR USUARIO LINUX EN Android

NOTA: El dispositivo debe estar rooteado.

En Linux, capacidades se asignan a un usuario (un usuario es un identificador de proceso de hecho, normalmente un shell) por algún mecanismo de inicio de sesión, PAM siendo los módulos los más comunes. Pero no hay inicio de sesión de usuario en Android, así que tenemos que replicar eso de alguna manera. Vamos a crear un usuario de Linux, digamos "irfan" en Android.

Lo mejor es utilizar el UID de la aplicación terminal asignado en el momento de la instalación de la aplicación o puede utilizar cualquier UID no utilizado como el 6000.

Modifique o cree los archivos como se indica a continuación:

# /etc/passwd
irfan:x:10129:10129::/sdcard:/system/bin/sh
root:x:0:0::/data/local/tmp:/system/bin/sh

# /etc/group
aid_inet:x:3003:irfan,root

Para iniciar sesión como usuario "irfan" con aid_inet como grupo secundario, utilice un Conocedor de Linux busybox su binary que se refiere a /etc/passwd y /etc/group :

~$ id
uid=10129(u0_a129) gid=10129(u0_a129) groups=10129(u0_a129),9997(everybody)

~$ su -c 'busybox su - irfan'

~$ busybox id
uid=10129(irfan) gid=10129(irfan) groups=10129(irfan),3003(aid_inet)

Tenga en cuenta el uso de su dos veces. Primero su es el que obtienes cuando rooteas tu dispositivo. Es porque su debe ejecutarse con CAP_SETUID capacidad. Pero las aplicaciones normales de Android se ejecutan sin ninguna capacidad:

~$ capsh --print | grep Bounding
Bounding set =

La primera su nos otorga esa capacidad (y todas las demás) y nos evita la necesidad de setuid en busybox su binario.

Del mismo modo, puedes añadirte a tantos grupos como quieras, everybody , sdcard_rw y así sucesivamente.

FUENTE:

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X