钵钵鸡渗透

  • AMSI

windows defender服务(MsMpEng.exe)调用 AMSI,hook 脚本接口,尝试检测已知签名

bypass AMSI 检查最简单的方法是寻找 AMSI 不支持的区域。比如Excel 4.0 版本的宏,由 excel.exe 程序本身解释执行,不由 AMSI hook的 DLL 解释执行。PowerShell 2 解释器也不支持 AMSI。攻击者会尝试强制使用旧版本解释器。

AMSI会规范化字符串(检查已知恶意签名之前将字符串分解成不可分割的字符)需要时间,在规范化之后检测应用签名也会花更长时间。

我们的目的不是永久绕过 AMSI,只需要拖延防御时间,以便完成命令的运行(比如Windows defender无法检测加载器,在运行加解密shellcode后,C2已建立,直接把数据拖出来,这个时候windows defender再告警已经晚了)。

AMSI 是 Windows API,可以通过 Windows 进行管理。可以操纵 Windows,阻止其加载正确的 AMSI 库。PowerShell 中包含 AMSI 控件,此外还有一个 AMSI.dll 文件,该文件可能成为 DLL 受害的目标。

AMSI Bypass Tool(避免 AMSI 被检测的最可靠方法是使用没有特征码的原始命令和脚本。)

由于使用了 AMSI.dll,可以尝试阻止该 DLL 的加载,甚至可以在脚本解释器和 AMSI.dll 之间执行内存中间人攻击。

  • 常见的网络访问控制 (NAC) 解决方案

NAP - Windows Server 上的网络访问保护,Server 2016 之后不再支持
NPS - Windows Server 2016 及更高版本上的网络策略服务
OPNsense
pfSense
PacketFence (Linux package)

大部分的准入只是跟踪 MAC 地址,而且通常都会存在不安全的配置

无客户端网络访问控制 (NAC):实施时利用 Captive Portal Authentication 强制门户认证系统来验证用户身份,客户端连接到高度受限网络,通过 web 页面拦截强制进行身份验证,基于浏览器的验证检查,身份验证成功后授予内外网络的访问权限(使用客户端的 MAC 地址、IP 地址或两者来验证所有流量是否来自已认证的客户端。)

强制门户系统使用带外管理 (OOB),则可能会引入 SNMP 或其他管理协议的攻击向量;强制门户系统本身就是web,容易受到多种 Web 攻击;强制门户服务器的 HTTP 认证需要多个底层协议来支持。在强制门户认证之前,DHCP 和 DNS 等服务必须可供最终用户访问,这些基础设施也能构成攻击向量;攻击其他预认证客户端设备

无SSL的内部强制门户服务器:网络嗅探工具 Cain & Abel(以前官网 www.oxid.it ),如果你知道以前的下载地址,可以进行OSINT:https://web.archive.org/web/20160217062632/http://www.oxid.it/projects.html
综上:那些以前的网站现在已失效时,都可以进行以上OSINT

冒充已离开但仍处于身份验证状态的用户:内联强制门户系统使用 MAC/IP 地址验证已认证的客户端

MAC 地址伪造( MAC Address Impersonation):https://github.com/delebird/MAC_Cycler/tree/master/mshift
https://github.com/matthewlinton/Windows-Scripts/blob/master/macblast/Lib/macshift.exe
苹果系统以及其他linux系统AI一把梭即可:ifconfig en1 ether 00:00:00:00:00:00

无客户端代理的 NAC 存在兼容那些不支持该代理的系统:手机、iPad、掌上电脑和其他 PDA 等移动设备可能需要网络访问,但 NAC 供应商可能不支持这些设备。冒充这些设备进行白名单绕过。

系统验证:为了防止有人绕过网络访问控制 (NAC) 系统,厂商在 MAC 地址验证之外引入了额外的系统验证检查;Web 浏览器用户代理检查,被动操作系统指纹识别,JavaScript 操作系统验证(在 HTTP 响应中插入自定义 JavaScript 代码,收集有关客户端浏览器文档对象模型 (DOM) 信息)

Web 浏览器用户代理伪造:Firefox 插件 User-Agent Switcher
被动操作系统指纹识别:TCP协议栈指纹识别,对指纹与MAC地址不匹配的客户端发出警报或拒绝;类似开源工具 p0f,运行该工具会产生一个基线值,检查 TCP SYN 帧的特征(TTL,TCP 窗口大小,初始 TCP SYN 帧的总帧大小,不分片 (DF) 标志值,最大段大小的值,TCP 窗口缩放值,TCP 时间戳选项的行为,选择性 ACK 标志的状态,TCP 标志的顺序和存在情况,包括 NOP 指令,TCP SYN 数据包的特殊之处)
Windows的OSfuscate工具:用于修改操作系统指纹(http://www.irongeek.com/i.php?page=security/code
JavaScript 操作系统验证:navigator.appName,navigator.vendor,navigator.buildID,navigator.oscpu,navigator.product,navigator.productSub
自定义浏览器伪造 about:config 右键新建:Firefox 允许我们通过 JavaScript 创建配置键来自定义从 DOM 返回的值。配置键的格式为 general.XXX.override,其中“XXX”是“navigator”后缀的全小写 DOM 名称。(例如,要覆盖 navigator.oscpu,我们可以创建一个名为 general.oscpu.override 的键,并为其赋一个任意字符串值。)

  • 802.1x Controls

基于802.1X 的网络认证:客户端、交换机以及认证服务器(RADIUS 服务器),EAP/TLS 类型用于定义认证过程的执行方式以及所使用的认证类型;不支持 802.1X 或不支持所使用的 EAP 类型的设备通常会由于兼容性而导致认证绕过(例如打印机和其他嵌入式设备)
参考:https://support.huawei.com/enterprise/en/doc/DOC1000069608/e6deda59/example-for-configuring-8021x-authentication-to-control-user-access

预认证流量:客户端认证流量(Ethernet/802.1X/EAP )到交换机到RADIUS认证服务器(Ethernet/IP/RADIUS/EAP);许多 RADIUS 服务器在处理格式错误的 EAP 流量时都存在安全漏洞;攻击者可以使用畸形帧对 RADIUS 服务器进行模糊测试,如果无RADIUS 响应流量,我们就知道 RADIUS 服务器已停止响应。
畸形帧对 RADIUS 服务器进行模糊测试:入门级工具 https://www.willhackforsushi.com/code/eapmd5fuzzies.py
有线 EAP 影子攻击:使用与受害者不同的 IP 地址,但 MAC 地址相同;IEEE 802.1X 是二层协议,交换机不会受到影响
802.1X 影子:至少有两个以太网端口的设备可以被用作中间人攻击 (MitM) 设备,连接合法的 IEEE 802.1X 设备(例如电话或打印机)和网络交换机。可以创建一个到攻击者控制的 SSH 服务器的出站 SSH 会话。利用 SSH 反向 SOCKS 代理功能,攻击者可以使用此入站连接,通过代理链和其他支持 SOCKS 代理的工具,从受害者 IEEE 802.1X 认证器的访问级别访问受害者组织内部的资产。
VLAN 操纵或 VLAN 跳跃攻击:不支持windows包括它的虚拟机,Windows 系统(包括 Windows 10 及更早版本)本身并不支持 VLAN 中继功能,例如 IEEE 802.1Q;要利用 VLAN 配置错误或缺陷必须使用 Linux 系统
动态中继协议 (DTP) :思科专属;允许交换机确定并协商交换机端口的状态,使其成为使用 IEEE 802.1Q 或交换机间 LAN (ISL,思科专有中继协议) 的中继端口,或接入端口。如果能够诱骗交换机,使其认为连接的系统是使用 802.1Q 的交换机,那么就可以诱骗交换机将端口配置为 trunk 端口,从而将所有具有类似上行访问权限的 VLAN 流量向下传递。
VLAN 操纵或 VLAN 跳跃攻击工具:Yersinia;Linux VLAN 工具(包含vconfig 工具等)配置虚拟接口进行接入

所谓的跳跃攻击或对 DTP 端口的访问,即切换网卡接口等参数,把流量打过去
route add -net 0.0.0.0/0 eth0.200
# vconfig add eth0 100
# vconfig add eth0 200
# dhclient eth0.100
# dhclient eth0.200
# nmap -sS -p 10.10.200.1

软件定义网络(SDN):虚拟化平台通常利用虚拟交换机产品为不同的虚拟机分配VLAN,并构建软件定义网络(SDN)。由于虚拟化主机需要通过trunk端口访问物理交换机才能桥接多个VLAN,因此供应商建议管理员部署网络时启用trunk端口访问。
语音 VLAN 跳跃攻击:使用单个交换机端口将 VoIP 电话连接到语音 VLAN,同时第二个设备可以连接到该电话以访问不同的 VLAN。VoIP 电话实际上就变成了一个双端口交换机,为了桥接来自工作站(位于与电话不同的 VLAN)的流量,VoIP 电话必须成为一个中继端口(即使只是一个有限的中继端口),以便区分自身的流量和下游设备的流量。
Cisco 发现协议 (CDP) :通过检查 CDP 数据包,我们可以识别出本地 VLAN 号和 VoIP VLAN 号,这些信息足以让攻击者跳转到不同的 VLAN。
VoIP VLAN跳跃攻击:自动化攻击工具 Voiphopper

# dhclient eth0
# modprobe 8021q
# vconfig add eth0 200
# dhclient eth0.200
  • 网络操控

虽然有很多方法可以实施中间人攻击,但许多网络会部署防御措施来抵御常见的攻击技术,这迫使我们寻找不太常见的技术才能成功。

局域网操纵:arpspoof、Cain、Ettercap 和 Bettercap
ARP欺骗:向默认网关发送伪造的ARP应答消息(我是11客户端IP的mac值)。在操纵默认网关后,告知每个网络节点自己是默认网关(我是默认网关的mac值)。一旦完成,所有网络流量都会桥接到攻击者。
既然是伪造真实11客户端mac值,就存在真实11客户端的IP;既然是伪造默认网关mac值,就存在真实网关的IP值。
威胁狩猎统计大法:两个不同的IP值都告诉默认网关自己是同一个mac值?一分钟即可判断是否出现真实的arp欺骗攻击还是误报。

  • 路由攻击

底层思维认知力:注意,我们主要关注的是所有协议的“特性或功能点”,这种认知力类似于《如何掌握所有的程序语言》:http://www.yinwang.org/posts/master-pl (同理:我们不是掌握shrio反序列化或fastjson反序列化漏洞,而是掌握所有的反序列化漏洞。我们掌握的是存在一个库里面的危险函数而导致的反序列化漏洞,而不是各种钵钵鸡的语法糖)

热备路由器协议 (HSRP):多路由器高可用性;参与 HSRP 的路由器都配置了一个公共的虚拟 IP 地址,该地址为客户端设备的网关;使用 UDP/1985 协议定期向 224.0.0.2 发送多播 Hello 消息
HSRP 身份验证:默认明文传输,密码在HSRP Hello 消息中,默认密码为cisco;为组播224.0.0.2流量,无需发起中间人攻击即可观察到 HSRP 流量和 HSRP 身份验证数据;HSRP 支持使用共享密钥在所有设备上进行基于 MD5 的身份验证
HSRP 中间人攻击:攻击者能够观察到 HSRP 使用的认证字符串,利用 HSRP 漏洞发起中间人攻击,成为网络中新的主路由器;发送优先级高于被观察到的主路由器的 HSRP Hello 消息;收到攻击者的 HSRP Hello 消息后,原主路由器和辅助路由器将被降级为辅助路由器和三级路由器,失去对网络的控制权;攻击者将其网卡 MAC 地址更改为 00:00:00:00:00:XX,其中 XX 替换为 Hello 消息中观察到的 HSRP 组地址,并使用默认网关的 IP 地址;攻击者利用默认网关的 IP 地址,成为网络所有流量的中心节点,并在将流量转发到其他 HSRP 路由器之前进行中间人攻击;攻击者会定期在网络上发送 HSRP Hello 消息,以维持其作为主路由器的地位
HSRP 中间人攻击工具:Yersinia
虚拟路由器冗余协议 (VRRP / CARP):RFC 3768/RFC 5798;00:00:00:00:00:XX(其中“XX”是 VRRP 组)来共享一个虚拟 IP 地址;组播 224.0.0.18 向其他备用设备发送保活消息;VRRP 不使用 UDP 作为 IP 有效载荷,而是使用 IP 协议 112;VRRP 不包含任何身份验证或完整性检查;当攻击者在局域网中监听 VRRP 保活流量时,所有 VRRP 配置都存在漏洞
三层协议漏洞利用工具(含VRRP):Loki,https://insinuator.net/tag/loki/
路由协议:许多组织未能有效过滤路由协议流量,导致路由消息能够传递到最终用户段。作为攻击者,只要能够观察到路由协议流量(无论是 OSPF、RIP、RIPv2、EIGRP 还是其他协议),就有机会利用网络漏洞,发现内部网络,根据路由拓扑数据绘制网络基础设施图,获得大规模中间人攻击的机会
OSPF 快速入门:一种内部网关协议 (IGP),与外部网关协议(边界网关协议 (BGP))不同;组播地址 224.0.0.5 在网络上定期发组播数据包,向其他路由器通告其可用性并建立 OSPF 邻居关系;相邻路由器使用链路状态通告 (LSA) 相互共享拓扑信息;LSA 也会发送到上游邻居设备,区域内所有路由器都能共享路由拓扑的副本;OSPF 至少有一个区域,称为骨干区域,指定为“区域 0.0.0.0”或简称“区域 0”;rfc2328
路由故障:主机广播流量的 NetBIOS 名称服务器 (NBNS) 流量(表明此流量仅限于 LAN 流量,而非 WAN 流量)以及无连接 LDAP (CLDAP) 流量(可能来自 Windows 设备和其他客户端活动)。在同一 LAN 上,还存在 OSPF Hello 数据包;Auth Type:null;这种配置允许攻击者成为路由器,并参与内部网络的路由拓扑,根据需要注入路由
OSPF路由枚举:针对OSPF第一步是枚举内部网络的路由信息;路由信息并非通过OSPF Hello消息发送;攻击者必须以邻居设备的身份参与网络,才能接收揭示网络拓扑信息的LSA(链路状态通告);为了以路由器的身份参与,需要一个工具来发送必要的OSPF交换信息,以及在OSPF认证不为NULL的环境中用于MD5 challenge/response 质询/响应的共享密钥;攻击者加入网络后,会与指定路由器(DR)和备份指定路由器(BDR)建立邻居关系;通过建立邻居关系,攻击者可以获知路由表信息,并有机会发布自己的路由器;攻击者通过 OSPF 状态树与对等路由器进行交互(ExStart、Exchange、Loading、Full)
Loki工具:OSPF 枚举;OSPF MD5 challenge/response 认证机制攻击
边界网关协议 (BGP) 安全性:任何无法安全验证路由信息的路由功能都存在安全隐患,应使用完善的公钥基础设施 (PKI) 来签名和确认路由器间的通信;可以使用 https://isbgpsafeyet.com 检测上游 ISP 是否被列为安全
路由器虚拟机:Loki 工具可以作为操控内部路由表的实用工具,但无法代表路由器的所有功能;可带路由器到目标组织并用它来攻击内部网络基础设施,或者使用路由器虚拟机(Dynamips 是一款 Cisco IOS 虚拟机);Zebra+Quagga、FRR 或其他开源路由软件;Dynamips 的配置和管理较为复杂,Dynagen(一个 Python 脚本) 是 Dynamips 的一个简单前端;配置过程比较复杂,参考 https://www.gns3.com/

  • IPv6 渗透测试

IPv6 渗透测试:因为许多组织已经在不知不觉中将 IPv6 作为现代操作系统的默认组件,应用于传统计算设备和移动设备平台,但他们自己不知道;
IPv6 Header:Version字段;Traffic Classification 流量优先级;Flow Label 路由处理字段;Payload Length;Next Header;Hop Limit;Source Address;Destination Address
IPv6 地址说明:十六进制表示法,以 16 位为一组;冒号分割;所有前导 0 都可以省略,保留尾随 0;连续的 0 组,可以使用双冒号表示法 ("::") 将其省略仅限一次;

aaaa:0000:0000:0000:aaaa:0000:0aaa:aaaa
aaaa:0:0:0:aaaa:0:aaa:aaaa
aaaa::aaaa:0:aaa:aaaa

IPv6 地址:单播地址,任播地址,多播地址(不再使用广播地址);特殊的 IPv6 地址前缀(链路本地地址,唯一本地地址,组播 IPv6 流量,所有节点组播地址取代 IPv4 广播地址,EUI 64 扩展方法利用客户端 MAC 地址实现 IPv6 地址的无状态自动配置,互联网范围内的 IPv6 地址空间全球分配给区域注册机构,用于文档目的,用于 IPv4 到 IPv6 过渡的 Teredo 地址); 检查表 https://www.roesen.org/files/ipv6_cheat_sheet.pdf
Linux IPv6 接口配置:IPv6 驱动程序被编译成内核模块,可用 modprobe 命令加载

modprobe ipv6
ifconfig eth0 inet6 add IPv6/64
ifconfig eth0 | grep inet6
ifconfig eth0 inet6 del IPv6/64

IPv6攻击向量,本地 IPv6 设备枚举:局域网访问组织网络,利用被动和主动分析技术进行主机发现,无需不切实际的扫描 IPv6 地址范围;IPv6 地址 ff02::1 用于联系所有链路本地设备;ping6 命令联系网络上的所有本地设备,并将响应记录为 IPv6 邻居;当设备手动配置或通过 DHCPv6 或 ICMPv6 路由器发现 (RD) 分配 IPv6 地址时,它会以组播数据包的形式向其配置的地址发送 ICMP 邻居请求 (NS) 查询。网络上的所有其他节点都会收到该消息,并通过重复地址检测 (DAD) 机制确保新地址尚未被使用。通过被动监听这些 ICMPv6 NS 查询,我们可以识别加入网络的新 IPv6 设备;THC-IPV6 工具套件 (https://github.com/vanhauser-thc/thc-ipv6) 中包含的 detect-new-ip6 工具可用于识别作为 DAD 协议一部分的 ICMPv6 NS 消息,从而报告新 IPv6 节点的存在。 detect-new-ip6 工具还可以为每个发现的节点运行指定的命令或 shell 脚本,从而实现对已发现设备的自动扫描和利用(在 Debian Linux 发行版中,detect-new-ip6 工具已重命名为 atk6-detect-newip6)

主动发现,向所有链路本地主机进行多播 ping 操作
$ ping6 -c 5 ff02::1%eth0 >/dev/null
$ ip -6 neigh

被动发现,重复地址检测活动
# detect-new-ip6 eth0
# detect-new-ip6 eth0 ./your-custom-script.sh

IPv6攻击向量,扫描 IPv6 主机:操作系统 TCP/IP 协议栈通常会对组播地址和链路本地地址进行模糊解释,可以使用地址末尾的“%”和适配器标识符显式定义地址的“作用域”(类似你的隧道存在一个远程局域网的10.10段,但是你要注意是哪个网卡适配器,不要扫描结果为本地10.10段,然后本地无此段给你显示本地10.10段的扫描结果)

# nmap -6 -sS -sC aaaa:aaaa:0:1::23%eth0
# ncat aaaa:aaaa:0:1::23%eth0 80

ICMPv6 邻居发现 (ND) :ICMPv6 邻居发现 (ND)代替 ARP 协议;节点A 组播地址发送 ICMPv6 邻居请求 (NS) 消息寻找节点B MAC地址,节点B向节点A返回邻居通告 (NA) 消息;https://tools.ietf.org/html/rfc4861#section-3.1
IPv6攻击向量,邻居冒充中间人攻击:节点A 组播ICMPv6 邻居请求 (NS) 寻找节点B MAC地址;节点B向节点A返回邻居通告 (NA) 消息;攻击者向节点 A 发送包含其 MAC 地址的 NA 数据包,并设置了 NA ICMPv6 Override 标志替换之前的映射条目;节点 A 将所有发往节点 B 的流量都通过攻击者发送
邻居冒充中间人攻击工具:THC-IPV6 parasite6;利用 NA欺骗;ICMPv6 Override 标志覆盖

想象存在一个让外面的流量先进入到主机里的功能点,然后存在一个命令进行该功能点的实现:使用 sysctl 将 Linux 主机配置为路由器,让IPv6 流量转发到该主机上面
# sysctl -w net.ipv6.conf.all.forwarding=1 (大规模 IPv6 中间人攻击中,建议采用路由器冒充的替代攻击技术)
# parasite6 -lR eth0

IPv6 路由器通告:节点通过 ICMPv6 路由器请求 (RS) 消息发现路由器的存在;路由器响应所有节点的配置详情;攻击者也声称自己是路由器,且具有更高的优先级
IPv6攻击向量,IPv6 路由器通告中间人攻击:节点 A 向所有本地路由器发送 ICMPv6 路由器请求 (RS);路由器向所有组播节点返回路由器通告 (RA);攻击者发送自己的 RA,设置默认路由器优先级最高的通告;节点 A 将所有流量发送给攻击者,攻击者再将流量转发给合法路由器
IPv6攻击向量,IPv6 路由器中间人攻击:用于攻击已存在其他 IPv6 路由的网络;设置 IP 转发和合法的默认 IPv6 路由器;配置并启动 Linux IPv6 路由器守护进程
多种方法可以模拟 IPv6 路由器:包括 THC-IPV6 工具“fake_router6”。更可靠的方法是直接使用本页指定的配置指令配置 Linux IPv6 路由器软件“radvd”(http://www.litech.org/radvd)

# sysctl -w net.ipv6.conf.all.forwarding=1 
net.ipv6.conf.all.forwarding = 1 
# ip route add default via fc00:660:0:1::1(默认网关的合法地址) dev eth0 
# cat >/etc/radvd.conf 
interface eth0 {
AdvSendAdvert on; # 发广播
AdvDefaultPreference high; # 高广播优先级
MinRtrAdvInterval 3; # 广播最小间隔3秒
MaxRtrAdvInterval 4; # 广播最大间隔3秒
prefix fc00:660:0:1::/64 { # 客户端使用的地址空间
};
};
^D
# radvd -C /etc/radvd.conf

远程 IPv6 攻击:攻击者需要直接访问 IPv6 网络(ISP 提供)或通过 IPv4 到 IPv6 的隧道连接;SixXS (http://www.sixxs.net) 和 Hurricane Electric (http://www.he.net) 提供的免费 IPv6 隧道服务,可实现 IPv4 到 IPv6 的隧道访问,并分配静态 IPv6 地址;有关如何配置 Ubuntu Linux(包括 Slingshot Linux)以使用 SixXS 或 Hurricane Electric 隧道的详细步骤指南,请访问 https://wiki.ubuntu.com/IPv6 ;对于 Linux 系统来说,更简单的 IPv6 隧道方案是使用基于“miredo”守护进程的 IPv6 Teredo 隧道协议。在大多数 Linux 发行版上,只需启动 miredo 进程即可建立 IPv6 连接,从而可以 ping 通诸如 ipv6.google.com 之类的 IPv6 主机。Teredo 隧道建立后,其他扫描工具(例如 Nmap)也允许您扫描和枚举远程 IPv6 目标

# ping6 ipv6.google.com
connect: Network is unreachable
# miredo
# ping6 ipv6.google.com
... icmp_seq=1 ttl=666 time=66 ms

远程 IPv6 发现:远程 IPv6 攻击无法发现多播节点;扫描 IPv6 地址空间不切实际;必须依赖其他枚举技术(DNS、错误消息内容、HTTP/JS 内容,记录已入侵 IPv4 主机的 IPv6 地址,以便进行进一步的跳转和利用)

# dig +short IN AAAA www.google.com
www.l.google.com.
2607:f8b0:4006:803::1010

绕过 IPv4 过滤器:通常,以 IPv4 为中心的过滤规则会忽略 IPv6 的对应规则;可以使用 PAT 或本地代理在 IPv4 和 IPv6 之间进行中继。

C:\> netsh interface portproxy add v4tov6 listenport=445 connectport=80 connectaddress=fe80::6aa8:6dff:fe40:445 # 使用 IPv6 目标地址和端口启动 netsh proxy
$ socat TCP-LISTEN:445,reuseaddr,fork TCP6:[fe80::6aa8:6dff:fe40:9864]:445 # 使用 IPv6 目标地址和端口启动 socat 代理
# ./chiron_proxy.py eth0 192.168.21.128 127.0.0.1 -d fc00:660:0:1::46 # 启动 chiron_proxy.py 进行 IPv4 到 IPv6 传输
$ smbclient \\127.0.0.1\c$ -U student # 使用工具定位本地监听端口
  • 网络攻击

攻击加密流量,HTTPS:随着浏览器行为的改变,旧式的无效证书冒充攻击不太可能再次发生。仍然存在其他利用 HTTPS 安全性漏洞的方法,而无需触发证书警告。
Sslstrip:演示中间人攻击操纵 HTTP 流量;通过重写所有 HTTP 流量来移除对 HTTPS 的引用,从而避免任何证书警告;所有原本打算使用 SSL 的流量代理到合法的 SSL 服务器,但只向受害者发送 HTTP 流量,这使得攻击者可以访问所有内容,同时记录诸如 POST 语句之类的活动;https://github.com/moxie0/sslstrip
Sslstrip 利用 HTTPS 网站的常见漏洞(手动输入 https url 不受到攻击):许多用户一开始会发出普通的 HTTP 请求,然后服务器会将其重定向到 HTTPS。然而,由于用户依赖于安全性较低的协议(HTTP)进行重定向,安全性更高的协议(HTTPS)的安全性就受到了威胁。
Sslstrip 拦截:Victim (http://example.com/)--> sslstrip (https://example.com/)--> Server

当受害者通过攻击者的服务器浏览 HTTP 流量时,Sslstrip 会检查所有流量,并移除包含 HTTPS URL 的 HREF、302 和 303 重定向消息,将其替换为等效的 HTTP URL。

当受害者尝试访问重写的 HTTP URL 时,Sslstrip 会接受该流量并通过 HTTPS 将其转发到后端服务器。这样,安全服务器就不会看到任何表明客户端存在问题的活动。服务器返回的响应会通过 Sslstrip 重写为 HTTP 数据包并返回给受害者。

通过访问安全网站的活动,攻击者可以利用在受害者和安全网站之间观察到的 cookie 或凭据等信息,采取多种策略。

1. 启用 IP 转发,允许 Sslstrip 转发数据包
# echo "1" > /proc/sys/net/ipv4/ip_forward
2. 将所有 HTTP (TCP/80) 流量重定向到监听端口 8080 的 Sslstrip 进程,创建一个透明代理。
# iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
3. 启动 Sslstrip,监听 TCP/8080
# sslstrip -l 8080
4. 利用 Ettercap 通过 ARP 操纵成为中间人
# ettercap -TqM arp:remote /10.10.10.1-254// /10.10.10.1-254//
5. 监控 sslstrip.log,或使用 Ettercap 查看密码
# tail -f sslstrip.log

启用 HSTS:RFC 6797(用于应对Sslstrip 攻击);浏览器会记住此标头,如果后续请求通过 HTTP 与网站交互,则不会进行交互;浏览器会显示错误并拒绝与 HTTPS 网站通信,直到证书问题解决(消除了攻击者对 HSTS 网站发起 SSL 中间人攻击的可能性)

# curl -I https://accounts.google.com
HTTP/1.1 302 Moved Temporarily
Strict-Transport-Security: max-age=10893354; includeSubDomains
Location: https://accounts.google.com/ManageAccount

绕过 HSTS:浏览器会将主机名与 HSTS 列表进行匹配,强制执行全 SSL、无证书警告策略;
中间人攻击工具也可以重写主机名:www.facebook.com (浏览器已记录到 HSTS 规则),wwww.facebook.com (没有 HSTS 规则,攻击重写主机名,Victim (http://wwww.example.com/)--> sslstrip (https://www.example.com/)--> Server );最初在 Sslstrip2 中实现;使用伪造的 NTP 强制 HSTS 规则过期
绕过 HSTS 参考,2014年亚洲黑帽大会:https://www.blackhat.com/docs/asia-14/materials/Nve/Asia-14-Nve-Offensive-Exploiting-DNS-Servers-Changes.pdf
https://www.blackhat.com/docs/eu-14/materials/eu-14-Selvi-Bypassing-HTTP-Strict-Transport-Security-wp.pdf
Bettercap Sslstrip:# bettercap --proxy -T 172.16.0.11 -P POST
Mitmproxy + sslstrip工具:Mitmproxy 工具包含许多示例脚本,其中之一是 sslstrip.py

  • 加密技术与渗透测试

涉及数学、算法,以及更多数学知识;掌握一些基本技能,你就能识别出加密技术中的漏洞
关注的目标:广泛使用的协议(TLS、PGP 等)中识别加密漏洞并不常见(但存在配置或实现缺陷);一些其他使用加密技术但未彻底审查的常见系统包括(专有应用程序;其他无线协议;可移动存储驱动器;自定义 Web 应用程序会话 cookie 等;数据库表/列加密等)
评估加密技术工具:OpenSSL;支持的密码套件(https://testssl.sh/openssl-iana.mapping.html) ;已知漏洞(https://www.openssl.org/news/vulnerabilities.html) ;OpenSSL 使用技巧示例(https://www.redhat.com/sysadmin/6-openssl-commands https://iphelix.medium.com/openssl-tips-and-tricks-c61fe9068966)
流密码:流密码是一种每次加密一位数据的密码;如果密文数据长度为 63 字节,则明文数据长度也为 63 字节(加密流量性质的信息);例子包括 RC4(SSL、Kerberos、BitTorrent、WEP 和许多其他算法都使用 RC4)、A5/1(一些 GSM 网络使用 A5/1)和 E0(蓝牙使用 E0);所有流密码都会生成密钥流数据,然后将其与明文进行异或运算以生成密文(反之亦然)
关键评估,初始化值 IV 处理:密钥不能重复使用,所有流密码都必须确保每个密钥最多只能使用一次来加密数据;每个数据包的密钥(密钥=IV+secret,secret可以保持不变,每次改变IV,来加密每个数据包或文件)
分组密码:每次加密一个数据块;必须将最后几个字节填充到偶数块长度;8 字节的分组长度,密文为 64 字节,则密文长度为 57–64 字节;例如 AES、DES、3DES 和 Blowfish。
分组密码模式:任何分组密码都可以与多种模式一起使用(例如 AESCTR、3DES-CBC);介绍 ECB、CBC 和 CTR 模式
电子密码本(ECB)模式:使用相同的密钥加密每个数据块;相同的明文块加密后得到相同的密文块;攻击者可以识别重复的明文块;通常情况下,大量 0 会导致此问题;泄露有关明文的有趣信息;当遇到分组密码时,我们还需要知道它用了什么模式,比如3DES-ECB;当网络协议、文件和其他明文数据源包含大量 0x00 字节时,这通常是一个问题

xxd -p ecb.enc
abcdefg......abcdefg......

解释 ECB 的弱点:可以使用可视化工具,使用 AES-ECB 和 128 位密钥加密显示成图像(即所谓的基因图谱),AES-ECB 128 位加密图像存在明显的重复
演示 ECB 弱点的工具:http://www.willhackforsushi.com/code/ecb_encrypt_image.zip (使用时需要确保位图的宽度和长度都能被 4 整除);https://github.com/pakesson/diy-ecb-penguin/ ;ImageMagick 和 OpenSSL 命令

# 使用 ImageMagick 的 identify 命令查找图像大小
$ identify demo.png
demo.png PNG 283x168 283x168+0+0 8-bit sRGB 54.5KB 0.000u 0:00.000

# 移除图像压缩
$ convert -depth 32 demo.png demo.rgba

# 使用从字符串“demo”派生的密钥加密图像
$ openssl enc -aes-128-ecb -e -in demo.rgba -out demo-ecb.rgba -pass pass:demo

# 重新打包成新的 PNG 文件
$ convert -size 283x168 -depth 32 demo-ecb.rgba demo-ecb.png

密码块链接 CBC 模式:为每个块添加“随机性”;改进了 ECB 加密算法,防止出现重复块
CBC IV:CBC 算法使用初始化向量 (IV) 作为第一个“密文”块;加密后的 IV 与明文的第一个字节进行异或运算;IV “不应该”重复;重复的 IV 可能会泄露明文模式;数据包 1 和数据包 3 重复出现,攻击者可以推断出这两个数据包的明文内容相同

$ openssl enc -aes-128-cbc -in packet1 -K $KEY -iv $IV | xxd -p
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
$ openssl enc -aes-128-cbc -in packet2 -K $KEY -iv $IV | xxd -p
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
$ openssl enc -aes-128-cbc -in packet3 -K $KEY -iv $IV | xxd -p
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

计数器 CTR 模式:IV 与一个计数器值连接起来,该计数器值代表加密算法的输入;实际上是通过对明文和密钥流数据进行异或运算来像流密码一样工作,因此它也受流密码定律的约束。对于同一个加密密钥,初始化向量永远不会重复。
OpenSSL AES 示例:默认 AES 加密设置;CBC 模式;随机盐值(password);加密密钥和初始化向量 (IV)(-password);参考 OpenSSL 函数 EVP_DecryptInit_ex 的文档;随机盐值实际上使 IV 随机化

# OpenSSL 1.1.0 及更高版本;缺省值 `-cbc` 部分,默认为cbc模式;“-k”已被弃用,应该替换为“-pass pass:pass”;“-p”选项会在生成加密文件(file1.enc)时打印出盐值、密钥和初始化向量 (IV);大写的 `-K` 选项表示密钥的十六进制版本
$ openssl enc -aes-128-ecb -k pass -in file1 -out file1.enc

# 查看 OpenSSL 版本支持哪些加密套件
$ openssl list -cipher-algorithms

识别算法:识别所使用的算法可能比较困难;检查加密数据的大小;不能被 8 整除,流密码,通常是 RC4;终能被 16 整除,AES(128 位块大小);不能始终被 16 整除,但始终能被 8 整除,DES/3DES(64 位块大小);研究相关组织和开发者,了解可能的标准/库,已发布的供应商文档、专利申请、FCC 文件、技术支持论坛等。
哈希识别:许多系统使用哈希值作为处理或存储的输入;比如密码存储、HTTP 参数、消息完整性检查等;哈希值的长度和格式可以揭示其类型;哈希标识符根据长度和格式评估哈希值,区分 125 种哈希函数,区分可能匹配和不可能匹配的情况;https://github.com/blackploit/hash-identifier/ ;当工具无法绝对确定哈希类型时,它会列出可能用于生成该值但可能性较小的哈希函数,减少手动识别的工作量
数据是否加密:我们处理的是加密数据吗;混淆的数据可能具有误导性;加密数据应该与随机数据无法区分;没有可预测的模式;利用直方图可视化数据;测量有效载荷内容的熵;加密数据应该与随机数据无法区分,当攻击者评估加密系统的输出时,他应该无法区分加密数据和随机数据,因为没有发现任何可预测的模式;如果数据已加密(或随机),则直方图应该显示字节值的均匀分布,其中字节 0x20 的出现频率不应高于字节 0xEE
直方图工具:Pcaphistogram 统计 TCP 和 UDP 有效载荷中每个字节的频率,生成与 gnuplot 兼容的图表;https://github.com/joswr1ght/pcaphistogram/ ;加密的数据集会显示一条几乎均匀的直线,横跨整个 X 轴,每个唯一的字节值都对应一条直线;如果 0x01 到 0x10 的字节值比许多其他字节值更频繁出现,则表明数据未加密
南加州大学校园宿舍楼无线门锁系统:无线信号是用 HackRF 设备(https://greatscottgadgets.com/yardstickone/) 记录;刷开与开锁的无线波形非常相似,因此不可能是随机的或加密的;开门事件可以重放,导致系统记录了实际上并未发生的开门事件。不仅大部分信号没有加密,而且还可以被重放,导致记录虚假事件;安装商和制造商互相推诿,各自找借口,试图以知识产权和合同法为由推卸责任
使用 tcpick 和 ent 检测随机性:如果我们能够去除网络头(网络头显然与随机性相去甚远),我们就可以更仔细地观察嵌入式协议中每个字节的唯一性。实际上,如果“比特间距离”(即使用“ent”工具测量的熵)接近 8,那么从字节到字节的角度来看,就可以认为它是足够随机的。任何小于接近 8 的值要么不是随机的,要么是随机字节附近存在某种结构/元数据。tcpick 工具会读取 libpcap 数据包捕获文件并识别所有 TCP 会话。当使用“-wR”参数运行时,tcpick 会提取 TCP 会话有效负载数据,并将内容写入两个二进制文件,这两个文件分别由源 IP 地址、目标 IP 地址、目标端口以及“clnt”或“serv”字符串标识,分别代表客户端和服务器数据(客户端是发送初始 TCP SYN 数据包的节点)。
ent 工具应用多种统计分析技术来识别文件的熵或随机性。
一个全零文件以 AES-CBC 模式加密后,其熵值为 7.99,如下所示

$ dd if=/dev/zero bs=1024 count=100 of=plaintext
$ openssl enc -aes-128-cbc -in plaintext -out ciphertext
$ ent ciphertext
Entropy = 7.997973

利用 scapy 和 ent 检测随机性:tcpick 不允许提取 TCP 层之上的应用层有效载荷数据,如果 TCP 头部之后、加密数据开始之前存在固定头部或其他字段,则可能会影响熵分析,可以使用 Scapy 来解决这个问题,Scapy 不仅限于 TCP 头部的有效载荷,它还允许我们访问任何上层协议数据并将其保存到文件中以进行熵分析(例如:packet.payload.payload.payload)

# scapy
>>> fp = open("payloads.dat","wb")   //打开一个输出文件,用于保存有效载荷内容
>>> def handler(packet):     //定义一个回调函数,Scapy 会针对指定数据包捕获中的每个数据包调用一次该函数。每次调用 `handler()` 函数时,它都会将 Scapy 数据包数据传递给变量 `packet`
... fp.write(str(packet.payload.payload.payload))   //将数据包有效载荷内容提取并保存到 `payloads.dat` 文件中,并将其转换为字符串。指定了 `packet.payload.payload.payload`,它代表以太网头部 -> IP -> TCP -> 有效载荷
...
>>> sniff(offline="capture1.pcap",prn=handler,filter="tcp or udp")  //调用 Scapy 的 sniff() 函数并读取 libpcap 的“capture1.pcap”数据包捕获文件作为输入数据。函数“handler”通过参数指定:“prn”函数用于标识回调函数,以及一个可选的过滤器,用于限制发送到 handler 函数的数据。

CBC 位翻转攻击:218

posted @ 2025-11-27 08:20  sec875  阅读(29)  评论(0)    收藏  举报