Skip to main content

在 Linux 上的信息搜集

在 Linux 上的信息搜集,这里有两层含义,一是指在Linux域主机上对所在域进行侦查,另一层是指使用 Kali Linux 或其他 Linux 攻击主机对目标域进行侦查。

第二个 Beacon

目前,我们只有一个来自 Web02 的 Beacon,以及 Web01 的 root 权限 Shell,还没有其他 PROD 域中用户的明文凭证。回想 chatjs 应用中出现的用户,我们发现他们都是域用户。

image.png

image.png

那么就可能存在密码重用,尤其是我们已经破解出 Alice 的密码为 elizabeth (无法还原出其他用户的密码)。再加上默认情况下,所有域用户都可以访问 SSH,那么我们不妨尝试使用 alice:elizabeth 登陆 Web01 的 SSH 服务。

image.png

我们成功登陆了 Web01。并且,我们通过 Chatjs 的利用获得了 root 权限,我们可以灵活地在 alice 与 root 用户之间切换。

查看 Alice 的描述,我们发现她可能具有对 File01 RDP 的访问。

image.png

我们知道 file01 有个公开可读可写的 SMB 目录 Tools,我们猜测其绝对路径为 C:\Tools (使用 UNC 路径执行程序可能会被阻止)。上传一个 Beacon,然后使用 SharpRDP (https://github.com/0xthirteen/SharpRDP) 在不开启 GUI 的情况下通过 RDP 协议远程执行该 Beacon。

sharprdp.exe computername=[FQDN] command="[程序绝对路径]" username=[域FQDN\用户名] password=[密码]

image.png

幸运的是,我们猜对了绝对路径,并且获得了新的 Beacon,来自 File01,当前用户为 PROD\Alice。这样,我们有了在 PROD 域的第一个 Beacon。




Linux域主机


有时,面向公众的服务器是 Linux 操作系统,例如 Web 服务器。在利用 Web 应用的漏洞后,我们成功地以普通用户或 root 的身份访问该 Linux 服务器。如果作为普通用户身份,甚至不是域用户,而是 www-data 等服务账户,这时候我们既不知道任意域用户的明文凭证,也无法访问所有文件,因此我们最好的策略是想办法提升到 root 权限,但不排除服务器有一些文件权限的不当配置,使得普通用户也能读取甚至更改一些敏感文件。如果作为root用户,我们可以访问所有的文件了,但依旧没有任何用户的明文密码。在之前的章节里说了,我们需要关注用户的 ccache 文件,位于/tmp 目录下,以及用户与主机的 keytab 文件。域主机的keytab文件固定位于/etc/krb5.keytab,而用户的 keytab 文件不固定,取决于用户习惯。

通常来讲,我们可以通过 SOCKS 代理在攻击主机上远程枚举域信息,但有的加入域的主机会自带一些工具,例如 ldapsearch、pbis-open (https://github.com/BeyondTrust/pbis-open),以及 rpcclient 等。

RPCClient

在 Web01 上并没有内置 RPCClient,不过很多时候该应用是内置的,那我们透过 SOCKS 来枚举。使用 rpcclient,我们需要指定明文帐号密码,尽管有的时候空会话是允许的。
rpcclient -U <域 FQDB>/<账户>%<密码> <DC>
用户

我们通过 enumdomusers 命令来查看所有用户

root@ts:~# proxychains rpcclient -U prod.raven-med.local/alice%elizabeth 172.16.1.11
ProxyChains-3.1 (http://proxychains.sf.net)
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:445-<><>-OK
rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[sql_service] rid:[0x641]
user:[app_security] rid:[0x642]
user:[network_security] rid:[0x643]
user:[alice] rid:[0x645]
user:[harold] rid:[0x646]
user:[backup_operator] rid:[0x647]
user:[john] rid:[0x648]
user:[newman] rid:[0x64b]
user:[jim] rid:[0x64c]
user:[carl] rid:[0x64d]
user:[fusco] rid:[0x64e]

image.png

通过命令 query <RID> 来查看用户详情

rpcclient $> queryuser 0x641
        User Name   :   sql_service
        Full Name   :
        Home Drive  :
        Dir Drive   :
        Profile Path:
        Logon Script:
        Description :
        Workstations:
        Comment     :
        Remote Dial :
        Logon Time               :      Tue, 28 Mar 2023 03:04:56 UTC
        Logoff Time              :      Thu, 01 Jan 1970 00:00:00 UTC
        Kickoff Time             :      Thu, 01 Jan 1970 00:00:00 UTC
        Password last set Time   :      Sat, 28 Jan 2023 19:35:18 UTC
        Password can change Time :      Sun, 29 Jan 2023 19:35:18 UTC
        Password must change Time:      Thu, 14 Sep 30828 02:48:05 UTC
        unknown_2[0..31]...
        user_rid :      0x641
        group_rid:      0x201
        acb_info :      0x00000210
        fields_present: 0x00ffffff
        logon_divs:     168
        bad_password_count:     0x00000000
        logon_count:    0x0000000a
        padding1[0..7]...
        logon_hrs[0..21]...

image.png

群组
对于群组,也是类似的,通过 enumdomgroups 命令枚举群组

image.png

对于更多命令,查看 help 菜单即可。

image.png

LDAPSearch

ldapsearch 也是自带的 LDAP 交互工具之一,并且 Web01 上就有安装。我们同样需要指定明文帐号密码,除非空会话被允许。
ldapsearch -h <DC IP> -p 389 -x -b "<站点>" -D '<域\用户>' -w '<密码>'
用户

我们指定了 objectclass user,并且提取 samaccountname 属性:

web01@web01:~$ ldapsearch -h 172.16.1.11 -p 389 -x -b "dc=prod,dc=raven-med,dc=local" -D 'prod\alice' -w 'elizabeth' '(objectclass=user)' samaccountname
# extended LDIF
#
# LDAPv3
# base <dc=prod,dc=raven-med,dc=local> with scope subtree
# filter: (objectclass=user)
# requesting: samaccountname 
#

# Administrator, Users, prod.raven-med.local
dn: CN=Administrator,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: Administrator

# Guest, Users, prod.raven-med.local
dn: CN=Guest,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: Guest

# DC01, Domain Controllers, prod.raven-med.local
dn: CN=DC01,OU=Domain Controllers,DC=prod,DC=raven-med,DC=local
sAMAccountName: DC01$

# krbtgt, Users, prod.raven-med.local
dn: CN=krbtgt,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: krbtgt

# RAVEN-MED$, Users, prod.raven-med.local
dn: CN=RAVEN-MED$,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: RAVEN-MED$

# FILE01, File Server, Assets, prod.raven-med.local
dn: CN=FILE01,OU=File Server,OU=Assets,DC=prod,DC=raven-med,DC=local
sAMAccountName: FILE01$

# SRV01, SQL Server, Assets, prod.raven-med.local
dn: CN=SRV01,OU=SQL Server,OU=Assets,DC=prod,DC=raven-med,DC=local
sAMAccountName: SRV01$

# WEB01, Web Server, Assets, prod.raven-med.local
dn: CN=WEB01,OU=Web Server,OU=Assets,DC=prod,DC=raven-med,DC=local
sAMAccountName: WEB01$

# sql_service, Users, prod.raven-med.local
dn: CN=sql_service,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: sql_service

# app_security, Users, prod.raven-med.local
dn: CN=app_security,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: app_security

# network_security, Users, prod.raven-med.local
dn: CN=network_security,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: network_security

# alice, Users, prod.raven-med.local
dn: CN=alice,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: alice

# harold, Users, prod.raven-med.local
dn: CN=harold,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: harold

# backup_operator, Users, prod.raven-med.local
dn: CN=backup_operator,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: backup_operator

# john, Users, prod.raven-med.local
dn: CN=john,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: john

# newman, Users, prod.raven-med.local
dn: CN=newman,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: newman

# jim, Users, prod.raven-med.local
dn: CN=jim,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: jim

# carl, Users, prod.raven-med.local
dn: CN=carl,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: carl

# fusco, Users, prod.raven-med.local
dn: CN=fusco,CN=Users,DC=prod,DC=raven-med,DC=local
sAMAccountName: fusco

# search reference
ref: ldap://DomainDnsZones.prod.raven-med.local/DC=DomainDnsZones,DC=prod,DC=r
 aven-med,DC=local

# search result
search: 2
result: 0 Success

# numResponses: 21
# numEntries: 19
# numReferences: 1

image.png

主机

我们指定了 objectclasscomputer,并且提取 dnshostname 属性:

web01@web01:~$ ldapsearch -h 172.16.1.11 -p 389 -x -b "dc=prod,dc=raven-med,dc=local" -D 'prod\alice' -w 'elizabeth' '(objectclass=computer)' dnshostname
# extended LDIF
#
# LDAPv3
# base <dc=prod,dc=raven-med,dc=local> with scope subtree
# filter: (objectclass=computer)
# requesting: dnshostname 
#

# DC01, Domain Controllers, prod.raven-med.local
dn: CN=DC01,OU=Domain Controllers,DC=prod,DC=raven-med,DC=local
dNSHostName: dc01.prod.raven-med.local

# FILE01, File Server, Assets, prod.raven-med.local
dn: CN=FILE01,OU=File Server,OU=Assets,DC=prod,DC=raven-med,DC=local
dNSHostName: file01.prod.raven-med.local

# SRV01, SQL Server, Assets, prod.raven-med.local
dn: CN=SRV01,OU=SQL Server,OU=Assets,DC=prod,DC=raven-med,DC=local
dNSHostName: srv01.prod.raven-med.local

# WEB01, Web Server, Assets, prod.raven-med.local
dn: CN=WEB01,OU=Web Server,OU=Assets,DC=prod,DC=raven-med,DC=local
dNSHostName: web01.prod.raven-med.local

# search reference
ref: ldap://DomainDnsZones.prod.raven-med.local/DC=DomainDnsZones,DC=prod,DC=r
 aven-med,DC=local

# search result
search: 2
result: 0 Success

# numResponses: 6
# numEntries: 4
# numReferences: 1

image.png

Linux攻击主机
我们可以把在Linux域主机上搜集到的 ccache文件以及keytab文件转移到攻击主机上,使用 KeyTabExtract (https://github.com/sosdave/KeyTabExtract) 脚本从keytab文件中提取出NTLM哈希或者密钥值,然后使用 python 版的 BloodHound 即bloodhound-python (https://github.com/fox-it/BloodHound.py) 对目标域进行枚举


BloodHound Python

python3 keytabextract.py krb5.keytab

image.png

bloodhound-python -c ALL -u '[域主机或域用户]' --hashes 00000000000000000000000000000000:[NTLM哈希] -d [域名] -ns [域控制器IP] --dns-tcp

image.png

当然也有一些其他的工具协助我们在Linux攻击主机上对域进行枚举甚至进行利用,例如 Impacket (https://github.com/SecureAuthCorp/impacket)系列工具、CME (https://github.com/Porchetta-Industries/CrackMapExec) 工具、pywerview (https://github.com/the-useless-one/pywerview) 等,以及上述提到的pbis-open,ldapsearch,rpcclient等工具,这里不做具体的用法展示,请学员们自行探索用法。

Impacket


CrackMapExec