【THM】Enumeration(枚举-后渗透阶段)-红队
本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/enumerationpe
本文相关内容:简单介绍当你接近一个未知的企业环境时应该如何进行枚举(即后渗透枚举)。
简介
本文的重点是介绍在后渗透阶段中的枚举操作,换句话说,我们将假设我们已经成功地获得了对目标系统的某种形式的访问权限;而且,我们还可能已经执行了权限提升,即我们在目标系统上可能拥有管理员权限或root权限。当然,在本文实验环境中所讨论的一些技术和工具,即使是在当前帐户没有最高权限的情况下,仍然可以为我们提供一些有用的输出结果。
如果你对权限提升感兴趣,你可以查看以下历史博客内容;此外,还有两个方便使用的提权脚本值得我们了解,它们分别是适用于Windows权限提升和Linux权限提升的WinPEAS以及LinPEAS。
在后渗透阶段,我们应该尽可能多地收集信息,以帮助我们获得针对目标网络的更多访问权限;例如,我们可能能够通过枚举找到授予对另一个系统访问权限的登录凭据。我们可以选择使用在标准系统上通常会内置的一些工具,以此来收集关于目标的更多信息,因为这些内置工具是系统的一部分,所以它们看起来是无害的,并且在运行时所造成的“噪音”也最少(可能不会被注意到)。
我们假设你可以访问目标计算机的命令行界面,比如Linux系统上的bash
或者MS Windows系统上的cmd.exe
。当我们打开Linux上的一种shell时,通常很容易切换到另一种shell;类似地,如果我们打开了cmd.exe
,如果可用的话,也可以轻松切换到PowerShell。例如,我们可以在cmd界面中调用powerShell.exe,这样就能从终端界面启动PowerShell交互式命令行环境。
user@TryHackMe$ Microsoft Windows [Version 10.0.17763.2928]
(c) 2018 Microsoft Corporation. All rights reserved.
strategos@RED-WIN-ENUM C:\Users\strategos>powershell.exe
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\Users\strategos>
本文所涉及的内容主题如下:
- Purpose of enumeration(枚举的目的);
- 使用通常会安装的工具来枚举Linux:枚举系统、用户、网络和正在运行的服务等;
- 使用内置工具来枚举MS Windows:枚举系统、用户、网络和正在运行的服务等;
- 其他可用于枚举的工具示例:Seatbelt等。
答题
阅读本小节内容,回答以下问题。
枚举的目的
当你在目标系统上获得一个shell时,你通常能够对其系统信息有一个基本的了解。如果目标机器是一个服务器,那么你可能已经知道了你是针对哪个服务进行了漏洞利用,但你不一定知道目标系统的一些其他详细信息,比如用户名或网络共享等;因此,即使你已经获得了初始访问权限,但是目标系统看起来仍然像一个“黑暗的房间”,你只能对其周围的事物有一个不完整和模糊的认识,从这个意义上来说,通过枚举能够帮助你构建关于目标系统的更完整和更准确的认知。
在后渗透阶段进行枚举的目的是收集有关目标系统及其网络的尽可能多的信息,这些已经被利用的系统可能是公司的台式机/笔记本电脑或者服务器。我们的目标是通过枚举收集信息,进而使我们能够转向网络上的其他系统或者更好地利用当前的系统。
我们经常会收集的一些信息包括:
- Users and groups:用户和组;
- Hostnames:主机名;
- Routing tables:路由表;
- Network shares:网络共享;
- Network services:网络服务;
- Applications and banners:应用程序和横幅;
- Firewall configurations:防火墙配置;
- Service settings and audit configurations:服务设置和审计配置;
- SNMP and DNS details:SNMP 和 DNS 详细信息;
- Hunting for credentials: 寻找凭据,这些凭据可能保存在 Web 浏览器或客户端应用程序中。
我们没有办法全部列出在进行枚举时可能偶然发现的东西,例如,我们可能会在当前系统上找到能够允许我们访问其他系统的SSH密钥。在基于SSH密钥的身份验证机制中,往往要用到SSH密钥对(包括公钥和私钥),其中SSH公钥会被安装在某个服务器上,这将导致相关的服务器会信任任何可以提供对应的SSH私钥的系统。
此外,在针对目标系统进行枚举时,我们可能会发现保存在用户文档或桌面目录中的敏感数据,而且在找到的源代码文件中也可能会包含隐藏的密钥和密码信息,特别是在这些源代码不打算公开的情况下。我们可以假设以下场景:计算机使用者可能会在目标系统上保留passwords.txt
文件或passwords.xlsx
文件(此类文件可能会包含登录凭据)。
答题
阅读本小节内容,回答以下问题。
Linux 枚举
本小节的重点是在获得初始访问shell (如bash)之后枚举Linux目标计算机。虽然有些命令能够提供关于多个区域的信息,但是我们可以根据预期将获得的信息把这些命令分为以下四种类型:
- 枚举System(系统)信息;
- 枚举Users(用户)信息;
- 枚举Networking(网络)信息;
- 枚举Running Services(正在运行的服务)信息。
枚举系统信息
在Linux系统上,我们可通过在/etc/
中搜索以-release
结尾的文件或链接来获得Linux发行版本的相关信息,我们只需执行ls /etc/*-release
命令即可,让我们以CentOS Linux系统为例:
user@TryHackMe$ ls /etc/*-release
/etc/centos-release /etc/os-release /etc/redhat-release /etc/system-release
$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
[...]
或者以Fedora Linux系统为例:
user@TryHackMe$ ls /etc/*-release
/etc/fedora-release@ /etc/os-release@ /etc/redhat-release@ /etc/system-release@
$ cat /etc/os-release
NAME="Fedora Linux"
VERSION="36 (Workstation Edition)"
[...]
我们可以使用hostname
命令来查找系统名称。
user@TryHackMe$ hostname
rpm-red-enum.thm
Linux系统上的各种文件可以为我们提供大量有用的信息,我们特别要考虑的是/etc/passwd
、/etc/group
和/etc/shadow
等文件。系统上的任何用户都可以读取passwd
文件和group
文件,但是,shadow
(影子)密码文件则需要有root权限才能进行读取,因为该文件中包含了加密的用户hash密码。如果你能设法破解shadow
文件中的hash值,那么你就能知道对应用户的原始密码。
user@TryHackMe$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
[...]
michael:x:1001:1001::/home/michael:/bin/bash
peter:x:1002:1002::/home/peter:/bin/bash
jane:x:1003:1003::/home/jane:/bin/bash
randa:x:1004:1004::/home/randa:/bin/bash
$ cat /etc/group
root:x:0:
[...]
michael:x:1001:
peter:x:1002:
jane:x:1003:
randa:x:1004:
$ sudo cat /etc/shadow
root:$6$pZlRFi09$qqgNBS.00qtcUF9x0yHetjJbXsw0PAwQabpCilmAB47ye3OzmmJVfV6DxBYyUoWBHtTXPU0kQEVUQfPtZPO3C.:19131:0:99999:7:::
[...]
michael:$6$GADCGz6m$g.ROJGcSX/910DEipiPjU6clo6Z6/uBZ9Fvg3IaqsVnMA.UZtebTgGHpRU4NZFXTffjKPvOAgPKbtb2nQrVU70:19130:0:99999:7:::
peter:$6$RN4fdNxf$wvgzdlrIVYBJjKe3s2eqlIQhvMrtwAWBsjuxL5xMVaIw4nL9pCshJlrMu2iyj/NAryBmItFbhYAVznqRcFWIz1:19130:0:99999:7:::
jane:$6$Ees6f7QM$TL8D8yFXVXtIOY9sKjMqJ7BoHK1EHEeqM5dojTaqO52V6CPiGq2W6XjljOGx/08rSo4QXsBtLUC3PmewpeZ/Q0:19130:0:99999:7:::
randa:$6$dYsVoPyy$WR43vaETwoWooZvR03AZGPPKxjrGQ4jTb0uAHDy2GqGEOZyXvrQNH10tGlLIHac7EZGV8hSIfuXP0SnwVmnZn0:19130:0:99999:7:::
类似地,系统上的各种目录也可以显示关于用户的信息,并且还可能会包含敏感文件信息,例如/var/mail/
目录。
user@TryHackMe$ ls -lh /var/mail/
total 4.0K
-rw-rw----. 1 jane mail 0 May 18 14:15 jane
-rw-rw----. 1 michael mail 0 May 18 14:13 michael
-rw-rw----. 1 peter mail 0 May 18 14:14 peter
-rw-rw----. 1 randa mail 0 May 18 14:15 randa
-rw-------. 1 root mail 639 May 19 07:37 root
如果我们要查找Linux系统上已安装的应用程序,可以考虑列出/usr/bin/
和/sbin/
目录下的文件:
ls -lh /usr/bin/
ls -lh /sbin/
在基于 RPM 的 Linux 系统上,你可以使用rpm -qa
来获得所有已安装包的列表,其中-qa
参数表示我们要查询所有包。
在基于 Debian 的 Linux 系统上,你可以使用dpkg -l
来获得已安装包的列表。
user@TryHackMe$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-=====================================-==================================-============-===============================================================================
ii accountsservice 0.6.55-0ubuntu12~20.04.5 amd64 query and manipulate user account information
ii adduser 3.118ubuntu2 all add and remove users and groups
ii alsa-topology-conf 1.2.2-1 all ALSA topology configuration files
ii alsa-ucm-conf 1.2.2-1ubuntu0.13 all ALSA Use Case Manager configuration files
ii amd64-microcode 3.20191218.1ubuntu1 amd64 Processor microcode firmware for AMD CPUs
[... ]
ii zlib1g-dev:amd64 1:1.2.11.dfsg-2ubuntu1.3 amd64 compression library - development
枚举用户信息
虽然从诸如/etc/passwd
之类的文件内容中我们能得知用户名;但是,还有很多命令可以提供关于系统中的其他用户及其所在位置的更多详细信息。
我们可以使用who
命令来查看已登录的用户
user@TryHackMe$ who
root tty1 2022-05-18 13:24
jane pts/0 2022-05-19 07:17 (10.20.30.105)
peter pts/1 2022-05-19 07:13 (10.20.30.113)
查看上面的输出结果,我们可以看到用户root
是直接登录到系统的,而用户jane
和peter
则是通过网络连接到系统,我们能够看到这两个用户的IP地址。
注意:请不要把who
命令与能够打印有效用户 ID 的whoami
命令相混淆。
user@TryHackMe$ whoami
jane
如果想进一步分析用户信息,我们可以使用w
命令,它将显示已登录的用户以及这些用户正在做的事情。根据下面的终端输出结果,我们可以得知用户peter
正在编辑notes.txt
,用户root在执行less -s
命令,而用户jane
则在使用w
命令。
user@TryHackMe$ w
07:18:43 up 18:05, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 Wed13 17:52m 0.00s 0.00s less -s
jane pts/0 10.20.30.105 07:17 3.00s 0.01s 0.00s w
peter pts/1 10.20.30.113 07:13 5:23 0.00s 0.00s vi notes.txt
如果要打印真正有效的用户和组 ID,我们可以使用命令id
来完成。
user@TryHackMe$ id
uid=1003(jane) gid=1003(jane) groups=1003(jane) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
你想知道最近谁在使用这个系统吗?我们可以使用last
命令来显示关于最近的登录用户的列表;从列表中,我们可以看到谁退出了系统,以及该用户保持了多长时间的登录连接。在下面的输出结果中,我们可以看到用户randa
连续登录了17个小时,而用户michael
在登录4分钟后就选择退出了。
user@TryHackMe$ last
jane pts/0 10.20.30.105 Thu May 19 07:17 still logged in
peter pts/1 10.20.30.113 Thu May 19 07:13 still logged in
michael pts/0 10.20.30.1 Thu May 19 05:12 - 05:17 (00:04)
randa pts/1 10.20.30.107 Wed May 18 14:18 - 07:08 (16:49)
root tty1 Wed May 18 13:24 still logged in
[...]
最后,我们还可以使用sudo -l
命令,此命令将列出当前系统所调用的用户能够以root权限执行的命令或程序。
枚举网络信息
我们可以使用ip address show
命令 (可缩写为ip a s
)或者使用较旧的命令ifconfig -a
(其包已不再维护)来显示IP地址信息。如下面的终端输出所示:网络接口ens33
的IP 地址为10.20.30.129
,其子网掩码255.255.255.0
是用24
来表示的。
user@TryHackMe$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:a2:0e:7e brd ff:ff:ff:ff:ff:ff
inet 10.20.30.129/24 brd 10.20.30.255 scope global noprefixroute dynamic ens33
valid_lft 1580sec preferred_lft 1580sec
inet6 fe80::761a:b360:78:26cd/64 scope link noprefixroute
valid_lft forever preferred_lft forever
我们可以查看/etc/resolv.conf
配置文件,从而找到和当前系统相关的DNS服务器。以下示例是针对一个使用DHCP进行网络配置的系统,我们可以看到,它对应的DNS服务器被设置为10.20.30.2
。
user@TryHackMe$ cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain thm
nameserver 10.20.30.2
在Linux系统上,我们可以使用netstat
命令来了解关于网络连接、路由表和接口统计数据的信息,我们将在下面的表格中解释此命令的一些常用参数选项。
关于此命令的更多参数选项,可参考: https://www.runoob.com/linux/linux-comm-netstat.html
在实际运行netstat
命令时,你可以使用任何需要的参数选项组合,例如,netstat -plt
命令将返回监听TCP套接字的程序信息。如下面的终端输出所示,我们可以看到:sshd
正在监听SSH
端口,而master
则正在监听IPv4和IPv6地址上的SMTP
端口。
注意:如果你想获取所有相关的PID(进程ID)和程序名,你需要以root
身份运行netstat
或使用sudo netstat
命令。
user@TryHackMe$ sudo netstat -plt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 978/sshd
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN 1141/master
tcp6 0 0 [::]:ssh [::]:* LISTEN 978/sshd
tcp6 0 0 localhost:smtp [::]:* LISTEN 1141/master
执行netstat -atupn
命令将会以数字格式显示所有的TCP和UDP监听、已经建立的连接、相关的地址和端口号、进程ID及程序名称。
user@TryHackMe$ sudo netstat -atupn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 978/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1141/master
tcp 0 0 10.20.30.129:22 10.20.30.113:38822 ESTABLISHED 5665/sshd: peter [p
tcp 0 0 10.20.30.129:22 10.20.30.105:38826 ESTABLISHED 5723/sshd: jane [pr
tcp6 0 0 :::22 :::* LISTEN 978/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1141/master
udp 0 0 127.0.0.1:323 0.0.0.0:* 640/chronyd
udp 0 0 0.0.0.0:68 0.0.0.0:* 5638/dhclient
udp6 0 0 ::1:323 :::* 640/chronyd
有些人可能会认为,在访问目标机器之前使用nmap
进行针对性的扫描,也会得到与使用上述命令类似的结果,然而,这种想法并不完全正确。在使用nmap扫描目标时,需要发送相当多的数据包来检查目标端口的开放情况,这就可能会触发目标的入侵检测系统和入侵防御系统;此外,在路由中的防火墙也会丢弃nmap所发送的某些数据包并会阻碍其进行扫描,从而导致nmap的输出结果不完整。
在Linux系统上,lsof
命令表示列出打开的文件(List Open Files),如果我们只想显示Internet和网络连接,我们可以使用lsof -i
命令。下面的终端输出显示了在IPv4和IPv6上处于监听状态的服务以及正在进行的连接,如用户peter
已经连接到了服务器rpm-red-enum.thm
的ssh
端口。
注意:如果想要获得和命令匹配的程序的完整列表,你需要以root用户身份运行lsof
或使用sudo lsof
命令。
user@TryHackMe$ sudo lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 640 chrony 5u IPv4 16945 0t0 UDP localhost:323
chronyd 640 chrony 6u IPv6 16946 0t0 UDP localhost:323
sshd 978 root 3u IPv4 20035 0t0 TCP *:ssh (LISTEN)
sshd 978 root 4u IPv6 20058 0t0 TCP *:ssh (LISTEN)
master 1141 root 13u IPv4 20665 0t0 TCP localhost:smtp (LISTEN)
master 1141 root 14u IPv6 20666 0t0 TCP localhost:smtp (LISTEN)
dhclient 5638 root 6u IPv4 47458 0t0 UDP *:bootpc
sshd 5693 peter 3u IPv4 47594 0t0 TCP rpm-red-enum.thm:ssh->10.20.30.113:38822 (ESTABLISHED)
[...]
由于上述列表可能会很长,因此我们可以通过指定感兴趣的端口(如SMTP的标准端口25)来进一步筛选输出结果。通过运行lsof -i:25
命令,我们将输出被限制为与端口25相关的结果,如下面的终端示例所示,我们可以看到本地smtp服务器正在监听IPv4和IPv6地址上的端口25。
user@TryHackMe$ sudo lsof -i :25
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
master 1141 root 13u IPv4 20665 0t0 TCP localhost:smtp (LISTEN)
master 1141 root 14u IPv6 20666 0t0 TCP localhost:smtp (LISTEN)
枚举正在运行的服务信息
获取正在运行的进程的快照(snapshot)可以为我们提供很多信息,在Linux系统上,我们可以使用ps
命令来允许我们发现正在运行的进程以及关于它们的大量信息。
我们可以使用ps -e
命令列出当前系统上的每个进程,其中-e
表示选择所有进程,如果想知道有关进程的详细信息,我们还可以添加-f
选项(full-format),或者添加-l
选项(long format),最终,我们将尝试的命令为ps -e
、ps -ef
和ps -el
。
使用BSD语法(和标准语法有区别,BSD语法不添加-
符号),你将获得和上述命令类似的输出结果,并且也能查看所有进程信息:ps ax
命令或ps aux
命令。请注意,在使用BSD语法时,以上命令示例中的参数a
和x
是必需的,因为它们解除了“ only yourself”和“ must have a tty”限制;换句话说,它们可以表示显示所有进程,而参数u
则可以表示显示拥有该进程的用户的详细信息。
如果想获得关于进程的可视化输出结果,我们可以使用命令ps axf
来打印进程树,其中-f
参数表示“forest(森林)”。
user@TryHackMe$ ps axf
PID TTY STAT TIME COMMAND
2 ? S 0:00 [kthreadd]
4 ? S< 0:00 \_ [kworker/0:0H]
5 ? S 0:01 \_ [kworker/u256:0]
[...]
978 ? Ss 0:00 /usr/sbin/sshd -D
5665 ? Ss 0:00 \_ sshd: peter [priv]
5693 ? S 0:00 | \_ sshd: peter@pts/1
5694 pts/1 Ss 0:00 | \_ -bash
5713 pts/1 S+ 0:00 | \_ vi notes.txt
5723 ? Ss 0:00 \_ sshd: jane [priv]
5727 ? S 0:00 \_ sshd: jane@pts/0
5728 pts/0 Ss 0:00 \_ -bash
7080 pts/0 R+ 0:00 \_ ps axf
979 ? Ssl 0:12 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
981 ? Ssl 0:07 /usr/sbin/rsyslogd -n
1141 ? Ss 0:00 /usr/libexec/postfix/master -w
1147 ? S 0:00 \_ qmgr -l -t unix -u
6991 ? S 0:00 \_ pickup -l -t unix -u
1371 ? Ss 0:00 login -- root
1376 tty1 Ss 0:00 \_ -bash
1411 tty1 S+ 0:00 \_ man man
1420 tty1 S+ 0:00 \_ less -s
[...]
总之,我们可以使用ps -ef
命令或ps aux
命令来获取所有正在运行的进程的列表,然后再考虑使用grep
命令来筛选管道输出,从而显示包含特定单词的输出行。如下面的终端示例所示,我们可以筛选出包含peter
内容的输出行。
user@TryHackMe$ ps -ef | grep peter
root 5665 978 0 07:11 ? 00:00:00 sshd: peter [priv]
peter 5693 5665 0 07:13 ? 00:00:00 sshd: peter@pts/1
peter 5694 5693 0 07:13 pts/1 00:00:00 -bash
peter 5713 5694 0 07:13 pts/1 00:00:00 vi notes.txt
答题
确保在TryHackMe实验房间中成功部署了Linux目标虚拟机,我们可以使用ssh user@MACHINE_IP
命令远程访问该目标机器,相关的登录凭据如下所示:
- Username:
user
- Password:
THM6877
tips:我们将使用命令枚举已部署的Linux机器并回答相关问题。
#在攻击机上执行以下命令
ssh user@10.10.154.174
#Password: THM6877
查看/etc/os-release
文件内容,获取当前Linux系统的发行版本信息:
cat /etc/os-release
查看最后登录系统的用户名:
last
查看处于监听状态下的最高TCP端口号,以及相关的服务程序名称:
sudo netstat -atlpn
查看在系统后台运行的以THM
开头的完整脚本名称:
ps -ef | grep THM
Windows 枚举
在本小节,我们将假设你已经可以访问目标Windows主机上的cmd
,在现实情况中,你可能需要通过利用漏洞并获得一个shell或反向shell来拥有这种访问权限,你可能还会在你所利用的目标系统上安装后门或设置SSH服务器等等。
接下来,我们将基于已获得的初始访问权限来枚举Windows目标计算机。
枚举系统信息
在Windows系统中,有一个可以提供系统详细信息的命令systeminfo
,它将为我们提供系统的构建版本、系统已安装的补丁等信息。在下面的示例中,我们可以看到当前系统已经安装了哪些修复(补丁)程序。
C:\>systeminfo
Host Name: WIN-SERVER-CLI
OS Name: Microsoft Windows Server 2022 Standard
OS Version: 10.0.20348 N/A Build 20348
OS Manufacturer: Microsoft Corporation
[...]
Hotfix(s): 3 Hotfix(s) Installed.
[01]: KB5013630
[02]: KB5013944
[03]: KB5012673
Network Card(s): 1 NIC(s) Installed.
[01]: Intel(R) 82574L Gigabit Network Connection
[...]
我们可以使用命令wmic qfe get Caption, Description
来检查系统已经安装的更新,这些信息将使我们了解系统打补丁和更新的速度。
tips:WMIC的全称为Windows Management Instrumentation Command,qfe参数的全称为Querying Fix Engineering,意思是查询修复工程或修补程序信息。
C:\>wmic qfe get Caption, Description
Caption Description
http://support.microsoft.com/?kbid=5013630 Update
https://support.microsoft.com/help/5013944 Security Update
Update
你可以使用net start
命令来检查已安装和已启动的Windows服务,执行该命令预计会得到一个很长的列表清单,以下输出内容有所删减。
C:\>net start
These Windows services are started:
Base Filtering Engine
Certificate Propagation
Client License Service (ClipSVC)
COM+ Event System
Connected User Experiences and Telemetry
CoreMessaging
Cryptographic Services
DCOM Server Process Launcher
DHCP Client
DNS Client
[...]
Windows Time
Windows Update
WinHTTP Web Proxy Auto-Discovery Service
Workstation
The command completed successfully.
如果你只对已经安装的应用程序感兴趣,你可以使用wmic product get name,version,vendor
命令来检索信息,执行此命令的示例结果如下:
#我们将获取到关于已安装的应用程序的产品名称、版本、供应商信息。
C:\>wmic product get name,version,vendor
Name Vendor Version
Microsoft Visual C++ 2019 X64 Minimum Runtime - 14.28.29910 Microsoft Corporation 14.28.29910
[...]
Microsoft Visual C++ 2019 X64 Additional Runtime - 14.28.29910 Microsoft Corporation 14.28.29910
枚举用户信息
如果想知道当前用户名称,可以简单地执行whoami
命令,如果想知道当前所拥有的权限,则可以使用whoami /priv
命令:
C:\>whoami
win-server-cli\strategos
C:\> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
========================================= ================================================================== =======
SeIncreaseQuotaPrivilege Adjust memory quotas for a process Enabled
SeSecurityPrivilege Manage auditing and security log Enabled
SeTakeOwnershipPrivilege Take ownership of files or other objects Enabled
[...]
此外,你还可以使用whoami /groups
来知道用户属于哪个组。如下面的终端输出显示,当前用户属于NT AUTHORITY\Local account and member of Administrators group
以及其他组:
C:\>whoami /groups
GROUP INFORMATION
-----------------
Group Name Type SID Attributes
============================================================= ================ ============ ===============================================================
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Local account and member of Administrators group Well-known group S-1-5-114 Mandatory group, Enabled by default, Enabled group
BUILTIN\Administrators Alias S-1-5-32-544 Mandatory group, Enabled by default, Enabled group, Group owner
[...]
tips:Alias的含义为——别名。
在Windows系统上,你可以选择通过执行net user
命令查看用户:
C:\>net user
User accounts for \\WIN-SERVER-CLI
-------------------------------------------------------------------------------
Administrator DefaultAccount Guest
michael peter strategos
WDAGUtilityAccount
The command completed successfully.
如果系统是Windows域控制器,你还可以使用命令net group
或者net localgroup
来发现可用组:
C:\>net localgroup
Aliases for \\WIN-SERVER-CLI
-------------------------------------------------------------------------------
*Access Control Assistance Operators
*Administrators
*Backup Operators
*Certificate Service DCOM Access
*Cryptographic Operators
*Device Owners
[...]
tips:Aliases的含义为——别名。
使用命令net localgroup administrators
,会列出属于本地管理员组的用户:
C:\>net localgroup administrators
Alias name administrators
Comment Administrators have complete and unrestricted access to the computer/domain
Members
-------------------------------------------------------------------------------
Administrator
michael
peter
strategos
The command completed successfully.
tips:Alias name的含义为——别名。
我们可以使用net accounts
来查看计算机上的本地帐户设置,此外,如果此计算机属于某个域,还可以使用net accounts/domain
命令。此命令有助于我们了解系统的密码策略,如最小密码长度、密码最长使用期限和密码锁定持续时间等。
枚举网络信息
我们可以使用ipconfig
命令简单地了解系统网络配置,如果你想知道所有与网络相关的设置,则可以使用ipconfig /all
命令;例如,我们想了解DNS服务器的网络配置,我们就可以使用ipconfig /all
。下面的终端示例显示了使用ipconfig
命令时的输出结果。
C:\>ipconfig
Windows IP Configuration
Ethernet adapter Ethernet0:
Connection-specific DNS Suffix . : localdomain
Link-local IPv6 Address . . . . . : fe80::3dc5:78ef:1274:a740%5
IPv4 Address. . . . . . . . . . . : 10.20.30.130
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 10.20.30.2
在MS Windows上,我们可以使用netstat
命令获取各种信息,例如系统中的哪些端口正处于监听状态、哪些连接处于活动状态以及谁在使用它们等等。在下面的示例中,我们使用参数选项-a
来显示所有侦听状态下的端口和正在活动的连接,使用-b
参数允许我们查找在连接中涉及的二进制文件,-n
参数则用于避免解析IP地址和端口号,最后,使用-o
参数可显示进程ID(PID)。
在下面显示的部分输出中,可以看到netstat -abno
命令将显示正在监听TCP端口22、135、445和3389的服务器,而进程sshd.exe、RpcSs和TermService则分别位于端口22、135和3389上。此外,我们还可以看到两个已建立的指向SSH服务器的连接,这将用状态ESTABLISHED
表示。
C:\>netstat -abno
Active Connections
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:22 0.0.0.0:0 LISTENING 2016
[sshd.exe]
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 924
RpcSs
[svchost.exe]
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
Can not obtain ownership information
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 416
TermService
[svchost.exe]
[...]
TCP 10.20.30.130:22 10.20.30.1:39956 ESTABLISHED 2016
[sshd.exe]
TCP 10.20.30.130:22 10.20.30.1:39964 ESTABLISHED 2016
[sshd.exe]
[...]
你可能会认为对目标系统进行端口扫描也会得到和上述示例相同的结果,然而,这是不准确的,原因有二:目标系统的防火墙可能会阻止扫描主机的流量到达特定的网络端口,此外,对目标系统进行端口扫描会产生相当大的流量,这并不像使用netstat
命令那样安静。
最后,在Windows系统上,使用arp -a
命令可以帮助我们发现同一LAN(局域网)上与当前系统进行过通信的其他系统。ARP代表地址解析协议,所以执行arp -a
将显示当前系统中的ARP条目,然后我们就能知道与当前系统发生通信的同一局域网上的其他系统的物理地址。如下例所示,命令输出结果中的IP地址以某种方式与当前系统进行了通信,所谓通信,可以是连接的尝试,甚至可以是执行过简单的ping
命令。
注意:下面示例中的10.10.255.255
并不代表系统的ip地址,它表示的是子网的广播地址。
C:\>arp -a
Interface: 10.10.204.175 --- 0x4
Internet Address Physical Address Type
10.10.0.1 02-c8-85-b5-5a-aa dynamic
10.10.16.117 02-f2-42-76-fc-ef dynamic
10.10.122.196 02-48-58-7b-92-e5 dynamic
10.10.146.13 02-36-c1-4d-05-f9 dynamic
10.10.161.4 02-a8-58-98-1a-d3 dynamic
10.10.217.222 02-68-10-dd-be-8d dynamic
10.10.255.255 ff-ff-ff-ff-ff-ff static
答题
确保在TryHackMe实验房间中成功部署了Windows Server目标虚拟机,我们可以使用ssh user@MACHINE_IP
命令远程访问该目标机器,相关的登录凭据如下所示:
- Username:
user
- Password:
THM33$$88
tips:我们将使用命令枚举已部署的Windows Server机器并回答相关问题。
#在攻击机上执行以下命令
ssh user@10.10.1.133
#Password: THM33$$88
查看操作系统全名、操作系统版本信息以及这台Windows Server机器安装了多少补丁:
systeminfo
查看在当前系统上处于监听状态的最低TCP端口号,以及相关的程序名称:
netstat -abno
DNS、SMB和SNMP简单枚举
枚举DNS(域名系统)
我们都知道DNS查询,它可以查找A、AAAA、CName和TXT等DNS记录,在后渗透阶段,如果我们能得到关于DNS服务器应答的所有记录“副本”,我们就可能在其中发现一些主机。
tips:关于DNS的更多介绍,可以参考历史博客:【THM】DNS in detail(DNS基础详解)-学习
为了获得DNS应答记录,我们可以尝试执行DNS区域传输,这可通过使用dig
命令来完成(也可以使用其他工具)。根据DNS服务器的具体配置,它可能会对DNS区域传输功能有所限制,所以在此功能不受限制的前提下,我们可以使用dig -t AXFR DOMAIN_NAME @DNS_SERVER
命令来进行DNS区域传输;其中-t AXFR
表示我们正在请求区域传输,DNS_SERVER
表示能够提供查询结果的DNS服务器,然后我们将查询与指定的DOMAIN _ NAME
相关的DNS记录。
枚举SMB(服务器消息块)
SMB是一个通信协议,它能够提供对文件和打印机等资源的共享访问。我们可以使用命令net share
来检查当前系统中的共享文件夹,下面是一个示例,我们可以看到C:\Internal Files
资源所对应的共享名称是Internal
。
user@TryHackMe$ net share
Share name Resource Remark
-------------------------------------------------------------------------------
C$ C:\ Default share
IPC$ Remote IPC
ADMIN$ C:\Windows Remote Admin
Internal C:\Internal Files Internal Documents
Users C:\Users
The command completed successfully.
枚举SNMP(简单网络管理协议)
简单网络管理协议(SNMP-Simple Network Management Protocol)可以帮助我们收集当前网络上的不同设备的信息,它可能让我们了解各种网络事件(如服务器硬盘故障、打印机没墨等),因此,SNMP可以为攻击者提供大量信息。
我们可以使用snmpcheck工具来查询与SNMP相关的服务器,它的语法很简单:/opt/snmpcheck/snmpcheck.rb MACHINE_IP -c COMMUNITY_STRING
。
如果你想在本地Linux机器上安装snmpcheck
,可以考虑使用以下命令:
git clone https://gitlab.com/kalilinux/packages/snmpcheck.git
cd snmpcheck/
gem install snmp
chmod +x snmpcheck-1.9.rb
答题
确保在TryHackMe实验房间中成功部署了Windows Server机器,如果有必要的话,我们可以使用上一小节中所提及的SSH凭据登录到目标机器。
tips:我们将使用命令枚举已部署的Windows Server机器并回答相关问题。
#在攻击机上执行以下命令
ssh user@10.10.1.133
#Password: THM33$$88
假设我们已经知道Windows Server机器的ip地址所对应的域名为redteam.thm
,我们现在将使用dig
命令来进行DNS区域传输,并查看DNS记录中的flag:
#在kali攻击机上执行以下命令
#dig -t AXFR DOMAIN_NAME @DNS_SERVER
dig -t AXFR redteam.thm @10.10.1.133 #指定目标机器ip地址
在Windows Server机器上枚举SMB共享,找到以THM
开头的可用共享的名称:
#在Windows目标机器上执行以下命令(此处需要在攻击机上使用ssh登录到目标机器)
net share
假设我们已经知道当前系统中的SNMP服务使用的community string是public
,我们现在将使用snmpcheck
来收集Windows Server机器的有关信息:
#在攻击机上执行以下命令,可能需要先安装snmpcheck
#/opt/snmpcheck/snmpcheck.rb MACHINE_IP -c COMMUNITY_STRING
/opt/snmpcheck/snmpcheck.rb 10.10.1.133 -c public #指定目标机器ip地址
#或者使用
snmpwalk -c public 10.10.1.133
#还可以使用msf中的 auxiliary/scanner/snmp/snmp_enum 模块
其他Windows枚举工具
关于可用于执行枚举操作的Windows工具,我们目前只介绍了一些Windows系统内置的命令行工具,但是还没有介绍图形用户界面(GUI)工具,而且,我们也没有介绍任何需要额外下载和安装的应用程序。
接下来,我们将简单介绍三个并非系统内置的Windows枚举工具:
- Sysinternals Suite
- Process Hacker
- GhostPack Seatbelt
Sysinternals Suite
Sysinternals Suite是由微软官方所提供下载的系统工具集,它包含了一组命令行和GUI实用程序和工具,使用这些工具能够为我们提供与Windows系统相关的各个方面的信息。
以下是一个关于Sysinternals Suite工具集中的部分工具的简表:
关于此工具集的更多信息,我们可以检查微软官方所提供的Sysinternals实用程序索引,以此来获得关于Sysinternals工具集中的实用程序的完整列表。
Process Hacker
Process Hacker是一个高效可靠的Windows GUI 工具,它可以帮助我们收集有关正在运行的进程的信息。具体而言,使用Process Hacker将为我们提供关于正在运行的进程和相关的活动网络连接的详细信息;此外,它还能让我们深入了解CPU、内存、磁盘以及网络的系统资源利用情况。
GhostPack Seatbelt
Seatbelt是GhostPack工具集的一部分,它是用C #编写的一个工具。Seatbelt并不是以二进制形式正式发布的,因此,为了使用该工具,我们还需要使用MS Visual Studio 来自己进行编译。
答题
阅读本小节内容,回答以下问题。
小结
本文的重点是介绍在Linux和MS Windows系统中可用于进行枚举的一些内置命令行工具,这两种系统中都存在许多命令,尽管它们的命令参数和输出结果是不同的。下面的列表显示了常用于枚举的Linux命令和Windows命令,我们依赖这些命令可以获得有关目标系统的更多信息。
Linux 命令 | 描述 |
---|---|
hostname |
显示系统的主机名 |
who |
显示谁已经登录了 |
whoami |
显示当前的系统有效用户名称 |
w |
显示谁登录了以及他们在做什么 |
last |
显示最后登录用户的列表 |
ip address show |
显示网络接口和地址 |
arp |
显示ARP缓存 |
netstat |
打印网络连接情况 |
ps |
processes snapshot,显示当前进程的快照,即获取进程相关信息 |
Windows 命令 | 描述 |
---|---|
systeminfo |
显示操作系统配置信息,包括服务包级别 |
whoami |
显示用户名和组信息以及相应的安全标识符 |
netstat |
显示协议统计数据和当前的 TCP/IP 网络连接情况 |
net user |
显示计算机上的用户帐户 |
net localgroup |
显示计算机上的本地组 |
arp |
显示由IP地址到物理地址的转换表 |
tips:本文所介绍的枚举主要是针对后渗透阶段中的Linux系统和Windows系统,此外,在后渗透阶段,我们还需要进行与Active Directory相关的枚举。