THM-Enumeration(枚举-后渗透阶段)-红队

发布时间 2023-05-08 22:34:20作者: Hekeats

本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/enumerationpe

本文相关内容:简单介绍当你接近一个未知的企业环境时应该如何进行枚举(即后渗透枚举)。

image-20230508222457198

简介

本文的重点是介绍在后渗透阶段中的枚举操作,换句话说,我们将假设我们已经成功地获得了对目标系统的某种形式的访问权限;而且,我们还可能已经执行了权限提升,即我们在目标系统上可能拥有管理员权限或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等。

答题

阅读本小节内容,回答以下问题。

image-20230506220107005

枚举的目的

image-20230507052123180

当你在目标系统上获得一个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文件(此类文件可能会包含登录凭据)。

答题

阅读本小节内容,回答以下问题。

image-20230507060056247

Linux 枚举

image-20230507195041560

本小节的重点是在获得初始访问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是直接登录到系统的,而用户janepeter则是通过网络连接到系统,我们能够看到这两个用户的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命令来了解关于网络连接、路由表和接口统计数据的信息,我们将在下面的表格中解释此命令的一些常用参数选项。

image-20230508080754247

关于此命令的更多参数选项,可参考: 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.thmssh端口。

注意:如果想要获得和命令匹配的程序的完整列表,你需要以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 -eps -efps -el

image-20230508093325288

使用BSD语法(和标准语法有区别,BSD语法不添加-符号),你将获得和上述命令类似的输出结果,并且也能查看所有进程信息:ps ax命令或ps aux命令。请注意,在使用BSD语法时,以上命令示例中的参数ax是必需的,因为它们解除了“ 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

image-20230508195643380

查看最后登录系统的用户名:

last

image-20230508195028099

查看处于监听状态下的最高TCP端口号,以及相关的服务程序名称:

sudo netstat -atlpn

image-20230508200335811

查看在系统后台运行的以THM开头的完整脚本名称:

ps -ef | grep THM

image-20230508200513881

image-20230508200556432

Windows 枚举

image-20230507195144903

在本小节,我们将假设你已经可以访问目标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

image-20230508201945971

查看在当前系统上处于监听状态的最低TCP端口号,以及相关的程序名称:

netstat -abno

image-20230508203631434

image-20230508203702833

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地址

image-20230508204027573

在Windows Server机器上枚举SMB共享,找到以THM开头的可用共享的名称:

#在Windows目标机器上执行以下命令(此处需要在攻击机上使用ssh登录到目标机器)
net share

image-20230508204425326

假设我们已经知道当前系统中的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

image-20230508220601380

image-20230508205421373

image-20230508222413282

其他Windows枚举工具

关于可用于执行枚举操作的Windows工具,我们目前只介绍了一些Windows系统内置的命令行工具,但是还没有介绍图形用户界面(GUI)工具,而且,我们也没有介绍任何需要额外下载和安装的应用程序。

接下来,我们将简单介绍三个并非系统内置的Windows枚举工具:

  • Sysinternals Suite
  • Process Hacker
  • GhostPack Seatbelt

Sysinternals Suite

Sysinternals Suite是由微软官方所提供下载的系统工具集,它包含了一组命令行和GUI实用程序和工具,使用这些工具能够为我们提供与Windows系统相关的各个方面的信息。

以下是一个关于Sysinternals Suite工具集中的部分工具的简表:

image-20230507062537626

关于此工具集的更多信息,我们可以检查微软官方所提供的Sysinternals实用程序索引,以此来获得关于Sysinternals工具集中的实用程序的完整列表。

Process Hacker

Process Hacker是一个高效可靠的Windows GUI 工具,它可以帮助我们收集有关正在运行的进程的信息。具体而言,使用Process Hacker将为我们提供关于正在运行的进程和相关的活动网络连接的详细信息;此外,它还能让我们深入了解CPU、内存、磁盘以及网络的系统资源利用情况。

GhostPack Seatbelt

SeatbeltGhostPack工具集的一部分,它是用C #编写的一个工具。Seatbelt并不是以二进制形式正式发布的,因此,为了使用该工具,我们还需要使用MS Visual Studio 来自己进行编译。

答题

阅读本小节内容,回答以下问题。

image-20230507064844072

小结

本文的重点是介绍在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相关的枚举。