护网红队面经
就随便上传一篇护网面经
红队
反弹shell
https://zhuanlan.zhihu.com/p/138393396
https://www.anquanke.com/post/id/87017
OWASP TOP 10
https://blog.csdn.net/fly910905/article/details/120541498
https://www.cnblogs.com/zhijiya/p/15142003.html
shiro反序列化
https://www.cnblogs.com/xiaozi/p/13239046.html
shiro在路径控制的时候,未能对传入的url编码进行decode解码,导致攻击者可以绕过过滤器,访问被过滤的路径
反序列化
aes key泄露 版本<1.2.4 key都为默认key rememberMe字段,使用密钥构造一个payload最后在不断地解密后到达readobject()
访问http://127.0.0.1/admin 的时候,页面返回403。因此可以确定admin路径是属于被过滤路径。此时使用burp截断,然后在访问路径的最后添加%2f,既可绕过shiro检测。因为对于浏览器来说%2f会被自动编码为/,但是burp截断之后进入shiro,shiro未对其解码,所以可以绕过。
shiro加密先是序列化字符串 然后通过硬编码的aeskey进行加密,最后base64加密
shiro反序列化的漏洞特征:
cookie里有remenberme=deleteme
shiro721由于aes/cbc加密导致会被padding oracle攻击
shiro 注入内存马
Tomcat 获得ServletContext对象
1.在jsp文件自带的变量 落地 不隐蔽
1 | Field reqF = request.getClass().getDeclaredField("request"); |
2.从Thread.currentThread()
里面找
WebappClassLoaderBase webappClassLoaderBase =(WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();
StandardContext standardCtx = (StandardContext)webappClassLoaderBase.getResources().getContext();
3.从JMXMBeanServer
的domainTb
下面直接获取
linstener filter servlet 都会用到AbstractTranslet TemplatesImpl正好继承 因为反序列化在加载字节码执行命令之前会验证相关类是否为AbstractTranslet
Request header is too large问题解决
- 1.改变
org.apache.coyote.http11.AbstractHttp11Protocol的maxHeaderSize
的大小 而这篇文章里面也说明了,但是由于request的inputbuffer会复用,所以我们在修改完maxHeaderSize
之后,需要多个连接同时访问 - 2.把恶意代码放在POST包的body里面
- 缩短字节码
tomcat 8/9
linstenr 可以再
tomcat7
1 | org.apache.catalina.core.ContainerBase |
查杀使用打开JvisualVM(需安装MBean插件) 找到catalina/filter节点 检查是否存在我们不认识的、没有在web.xml中配置或filterClass为空的Filter
绕waf的三种方法
1.未知请求方法 首先 第一步,先构造出先绕WAF,哪怕改成不合法的数据包。第二步,在绕WAF的数据包基础上修正,让后端中间件可以解析。 适用于Filter和Listener层
2.添加脏数据
1 | List<Object> arrayList = new ArrayList<Object>(); |
3.通过消耗waf的性能 把Content-Length
删除,分块传输不需要发送body长度,然后加上Transfer-Encoding: chunked
头。
WAF一般是如下应对分块传输的。
- 发现数据包是分块传输,启动分块传输线程进行接收
- 分块传输线程不断接收客户端传来的分块,直到接收到
0\r\n\r\n
- 将所有分块合并,并检测合并之后的内容。
weblogic
weblogic端口 7001
xmldecoder漏洞
weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。
影响版本jdk1.4-jdk11
weblogic T3反序列化历史漏洞
Weblogic利用T3协议反序列化,大多数是利用类封装恶意类绕过补丁(resolveClass
).
weblogic版本的探测
1 | t3 10.3.6 |
如果没有抓到就是t3协议未启用或者做了负载均衡
CVE-2015-4852
简答—利用t3协议通信反序列化CC链
漏洞出现在WLS Security组件,允许远程攻击者执行任意命令。攻击者通过向TCP端口7001发送T3协议流量,其中包含精心构造的序列化Java对象利用此漏洞。
调用链如下
InboundMsgAbbrev.readObject() -> … -> AnnotationInvocationHandler.readObject() -> AnnotationInvocationHandler.invoke() -> LazyMap.get() -> …. -> Runtime.exec()
CVE-2016-3510
这一次exp选择了weblogic.corba.utils.MarshalledObject进行绕过修复补丁
CVE-2017-3248
利用了JRMP Java远程方法协议。利用java.rmi.registry.Registry,序列化RemoteObjectInvocationHandler,并使用UnicastRef和远端建立tcp连接,获取RMI registry,最终将加载的内容利用readObject()进行解析,导致之前序列化的恶意代码执行
CVE-2017-3248
MarshalledObject+JRMP
Apache Commons Colletions基础漏洞修复,与CVE-2016-3510利用相同不过恶意类替换为JRMP,利用java.rmi.registry.Registry
.
CVE-2018-2628
MarshalledObject+JRMP
java.rmi.registry.Registry
替换为java.rmi.activation.Ac-tivator
,绕过resolveProxyClass判断
CVE-2018-2893
CVE-2017-0638 + CVE-2017-3248即StreamMessageImpl
中封装JRMPClient
CVE-2021-2394
是CVE-2020-14756和CVE-2020-14825的调用链相结合组成一条新的调用链来绕过weblogic黑名单列表。
xstream反序列化
XStream是Java类库,可以将对象序列化为XML格式或将XML反序列化为对象
XStream反序列化漏洞的存在是因为XStream支持一个名为DynamicProxyConverter的转换器,该转换器可以将XML中dynamic-proxy标签内容转换成动态代理类对象,而当程序调用了dynamic-proxy标签内的interface标签指向的接口类声明的方法时,就会通过动态代理机制代理访问dynamic-proxy标签内handler标签指定的类方法;利用这个机制,攻击者可以构造恶意的XML内容,即dynamic-proxy标签内的handler标签指向如EventHandler类这种可实现任意函数反射调用的恶意类、interface标签指向目标程序必然会调用的接口类方法;最后当攻击者从外部输入该恶意XML内容后即可触发反序列化漏洞、达到任意代码执行的目的。
1 | <sorted-set> |
绕过方法
标签属性绕过
<org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor serialization=”custom”>
custom 进行html编码
<org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor serialization=”custom”>
标签内容绕过
1.将标签内容html编码
2.注释绕过
Java主要依据函数:
ObjectOutputStream类的writeObject(Object obj)
ObjectOutputStream类的readObject(Object obj)
Bypass_disablefuntion
https://www.cnblogs.com/tr1ple/p/11213732.html
binary工具
通过攻击 PHP-FPM
使用条件
Linux 操作系统
PHP-FPM
存在可写的目录,需要上传
.so
文件
利用 LD_PRELOAD 环境变量
LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库
利用 FFI 扩展执行命令
使用条件:
Linux 操作系统
PHP >= 7.4
开启了 FFI 扩展且ffi.enable=true
利用FFI调用C库的system函数
create_function&fights=&invincibly=;}$ffi = FFI::cdef(“int system(const char command);”);$ffi->system(“ls / > /tmp/res.txt”);echo file_get_contents(“/tmp/res.txt”);/
利用FFI调用C库的popen函数
create_function&fights=&invincibly=;}$ffi = FFI::cdef(“void popen(char,char*);void pclose(void*);int fgetc(void*);”,”libc.so.6”);$o = $ffi->popen(“ls /“,”r”);$d = “”;while(($c = $ffi->fgetc($o)) != -1){$d .= str_pad(strval(dechex($c)),2,”0”,0);}$ffi->pclose($o);echo hex2bin($d);/*
利用FFI调用PHP源码中的函数
create_function&fights=&invincibly=;}$ffi = FFI::cdef(“int php_exec(int type, char cmd);”);$ffi->php_exec(3,”ls /“);/
Fastjson反序列化漏洞利用原理和POC
Fastjson反序列化漏洞被利用的原因,可以归结为两方面:
Fastjson提供了反序列化功能,允许用户在输入JSON串时通过“@type”键对应的value指定任意反序列化类名;
Fastjson自定义的反序列化机制会使用反射生成上述指定类的实例化对象,并自动调用该对象的setter方法及部分getter方法。
fastjson分为rmi ldap打法
不出网环境使用 bcel 或者c3p0
目前流传为三条链子
1.TemplatesImpl (常规字节码 需要开启Feature.SupportNonPublicField
)
2.JdbcRowSetImpl(目标没外网的情况下无法直接利用)jdk8u191之后不可用
3.BasicDataSource(BasicDataSource
的toString()
方法会遍历这个类的所有getter并执行调用到了createConnectionFactory
方法,代码中存在class.forname driverclassname和driverclassloader都可以被控制 写进恶意类就可以执行其中的static{}代码) jdk8u251之后不可用
BCEL这个包中有个有趣的类com.sun.org.apache.bcel.internal.util.ClassLoader
,他是一个ClassLoader,但是他重写了Java内置的ClassLoader#loadClass()
方法。
在ClassLoader#loadClass()
中,其会判断类名是否是$$BCEL$$
开头,如果是的话,将会对这个字符串进行decode
fastjson探测版本号
JavaBeanDeserializer 主要有两种方法可以触发。
- \1) 当代码使用
JSON.parseObject(json , clazz)
指定期望类的方式去解析 JSON,且 clazz 不能为 fastjson 已设定的大部分类型,如“Hashmap”、“ArrayList” - \2) 当使用
JSON.parse(json)
不指定期望类的时候可以通过 AutoCloseable 来触发 - [“test”:1]
java内存马
工具使用 java memshellscanner jsp页面查杀 arthas 终端运行查杀
如果是jsp注入,日志中排查可疑jsp的访问请求。
如果是代码执行漏洞,排查中间件的error.log,查看是否有可疑的报错,判断注入时间和方法
根据业务使用的组件排查是否可能存在java代码执行漏洞以及是否存在过webshell,排查框架漏洞,反序列化漏洞。
如果是servlet或者spring的controller类型,根据上报的webshell的url查找日志(日志可能被关闭,不一定有),根据url最早访问时间确定被注入时间。
如果是filter或者listener类型,可能会有较多的404但是带有参数的请求,或者大量请求不同url但带有相同的参数,或者页面并不存在但返回200
javaagent内存马总体来说就是可以使用 Instrumentation 提供的 retransform 或 redefine 来动态修改 JVM 中 class 的一种字节码增强技术,可以直接理解为,这是 JVM 层面的一个拦截器。
javaagent 有两种方法 premain()和agentmain() premain()在jdk1.5之后被引入 agentmain在jdk1.6之后被引入 区别在于 premain()要在项目启动之前使用 agentmain()可以在运行的时候载入
javaagent内存马查杀 jvm提供的sa-jdi.jar JVM 监控工具的api tools-class broswer查看被修改的类 通过retransformClass方法重新定义类 查杀工具copagent
jndi高版本注入
jndi8u191之后 由于tomcat8下带了个el包 所以可以调用来进行命令执行 同时这个方法也被用于c3p0中 成为了第四条链子
如何查看区分是扫描流量和手动流量
扫描器ua有特征
cobaltstrike马特征
看ip端口 50050 看文件的证书 fofa上搜
红队打点图
清除日志
wevtutil+for循环清除所有日志 #
for /F “tokens=*” %a in (‘wevtutil.exe el’) DO wevtutil.exe cl “%a”+
ps批量删除日志
PS C:> wevtutil el | Foreach-Object {Write-Host “Clearing $“; wevtutil cl “$“}
域内主机端口探测
nc -vv ip fscan -h 192.168.7.7 -p 22,445
主机存活探测
ping
使用 ping 进行检测的优点是不容易触发检测规则,缺点是速度较慢,如果目标开启了禁止 ping 的策略,那这个方法就 gg 了。
Windows #
for /l %i in (1,1,255) do @ping 192.168.7.%i -w 1 -n 1|find /i “ttl=”
C:\Users\daniel10>for /l %i in (1,1,255) do @ping 192.168.7.%i -w 1 -n 1|find /i “ttl=”
来自 192.168.7.7 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.7.107 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.7.110 的回复: 字节=32 时间<1ms TTL=128
LINUX
for k in $( seq 1 255);do ping -c 1 192.168.7.$k|grep “ttl”|awk -F “[ :]+” ‘{print $4}’; done
teamssix@localhost:~# for k in $( seq 1 255);do ping -c 1 192.168.7.$k|grep “ttl”|awk -F “[ :]+” ‘{print $4}’; done
使用工具
sqlmap
1 | -v #共7个级别(0~6),默认为1 |
0:只输出 Python 出错回溯信息,错误和关键信息
1:增加输出普通信息和警告信息
2:增加输出调试信息
3:增加输出已注入的 payloads
4:增加输出 HTTP 请求
5:增加输出 HTTP 响应头
6:增加输出 HTTP 响应内容
1
2
3
4-u URL
-l #从Burp代理日志文件中解析目标地址
-m #从文本文件中批量获取目标
-r #从文件中读取 HTTP 请求
1 | -p TESTPARAMETER #指定需要测试的参数 |
1 | -a, --all #获取所有信息、数据 |
使用实例
–os-shell
udf提权
nmap
1 | nmap -T4 -A -v -Pn IP |
XSS
可能触发DOM型XSS的属性:
document.referer属性、window.name属性、location属性、innerHTML属性、documen.write属性
绕过方式
Unicode转义
1 | <script>a\u006cert(1)</script> |
1
如果能够使用eval命令,就能够将其它命令以字符串的格式传送给eval,从而执行其它 命令。
1 | <script>eval('a\u006cert(1)');</script> |
替代圆点
1 | <script>alert(document['cookie'])</script> |
通用防御:
(1) 特殊字符HTML实体转码。最好的过滤方式是在输出和二次调用的时候进行加HTML实体一类的转码,防止脚本注入。
(2) 标签事件属性黑名单。特殊字符容易被绕过,所以还得加标签事件得黑名单或者白名单,这里推荐使用白名单的方式,实现规则可以直接使用正则表达式来匹配,如果匹配到的事件不在白名单列表,就可以直接拦截,而不是过滤为空
httponly情况下绕过
1.phpinfo 页面$_SERVER[“HTTP_COOKIE”]会打印出具有httponly属性的cookies
2.iframe钓鱼这一类
3.跳转钓鱼
4.通过js伪造一个登录表单,有的浏览器保存密码会自动填入
5.通过xss获取后端页面源码,有时候可以发现一些越权访问,或者配合CSRF打组合拳去添加新用户或者执行其他的功能,以及通过审计后台js发现一些漏洞
6.通过xss伪造oauth等搞一个oauth劫持
1.如果csp头有 unsafe-inline 可以利用页面预加载,比如<linkrel=’prefetch’href=’http://xxxx/x.jpg'>
2.利用url跳转可以回避严格的CSP
3.利用上传文件,比如csp禁⽌跨站读取脚本,但是可以跨站读img,那么传⼀个 含有脚本的img,再