Java安全-CommonCollection6链
利用链分析利用链:
123456789101112Gadget chain: java.io.ObjectInputStream.readObject() java.util.HashSet.readObject() java.util.HashMap.put() java.util.HashMap.hash() org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode() org.apache.commons.collections.keyvalue.TiedMapEntry.getValue() org.apache.commons.collections.map.LazyMap.get() org.apache.commons.collection ...
Java安全-CommonCollection5链
与CC1相比,使用了
123BadAttributeValueExpException.readObject() TiedMapEntry.toString() LazyMap.get()
来代替
1234AnnotationInvocationHandler.readObject() Map(Proxy).entrySet() AnnotationInvocationHandler.invoke() LazyMap.get()
从而触发transform,达到利用目的,所以只需要分析一下不同的这些部分
可以看到,BadAttributeValueExpException.readObject()中调用了calObj.toString(),这里的vaiObj来自字段val,我们可以通过反射来设置这个值,这里必须在最后再将val设置为我们构造好的TiedMapEntry,否则,toString会在BadAttributeValueExpException实例化的时候直接执行导致恶意代码直接执行:
接下来,进入TiedMapEnt ...
Java安全-CommonCollection4链
CC4使用
与CC2相比,使用了InstantiateTransformer来取代InvokerTransformer
利用链:
123456789101112131415Gadget chain: ObjectInputStream.readObject() PriorityQueue.readObject() PriorityQueue.heapify() PriorityQueue. siftDown() PriorityQueue.siftDownUsingComparator() TransformingComparator.compare() ChainedTransformer.transform() ConstantTransformer. ...
Java安全-CommonCollection3链
CC3使用
利用链:
与CC1相比,CC3使用了InstantiateTransformer代替了InvokerTransformer
所以整体的利用链是:
1234567891011121314Gadget chain: ObjectInputStream.readObject() AnnotationInvocationHandler.readObject() Map(Proxy).entrySet() AnnotationInvocationHandler.invoke() LazyMap.get() ChainedTransformer.transform() ConstantTransformer.transform() InstantiateTrans ...
Java安全-JNDI注入
原理:
InitialContext:
这里的var3就是获取到的Reference对象
getObjectFactoryFromReference:
JNDI的跟进lookup逻辑进行调试,如上图,找到对Reference的处理逻辑,其中动态加载并实例化Factory类,调用了factory.getObjectInstance()方法,获取外部远程对象实例。
攻击者可以在Factory类文件的构造方法、静态代码块、getObjectInstance()方法等处写入恶意代码,达到RCE的效果
Bypass利用受害者本地CLASSPATH中的类JDK版本:1.8.0_191以上
这里要让if (var8 != null && var8.getFactoryClassLocation() != null && !trustURLCodebase
这个判断结果为否,这里如果构造factoryLocation==null,则可以通过,但是在后面的
判断中无法进行loadClass加载我们的远程类。
所以我们的思路就变成了加载一个目标机器cla ...
Java安全-CommonCollection2链
利用链yso给出的利用链:
完整的:
12345678910ObjectInputStream.readObject() PriorityQueue.readObject() PriorityQueue.heapify() PriorityQueue. siftDown() PriorityQueue.siftDownUsingComparator() TransformingComparator.compare() InvokerTransformer.transform() TemplatesImpl.newTransformer() ...... ...
Java安全-CommonCollection1链
lazyMap利用链:
poc:
12345678910111213141516171819202122232425262728public InvocationHandler getObject(final String command) throws Exception { final String[] execArgs = new String[] { command }; // inert chain for setup final Transformer transformerChain = new ChainedTransformer( new Transformer[]{ new ConstantTransformer(1) }); // real chain for after setup final Transformer[] transformers = new Transformer[] { ...
SeedLab之firewall
FirewallTask 1: Using FirewallLinux有一个叫做iptables的工具,它本质上是防火墙。 在此任务中,目标是使用iptables设置一些防火墙策略,并在策略生效后观察系统的行为。
Prevent A from doing telnet to Machine B.本项实验需要用iptables实现阻挡机器A用telnet 连接机器B,命令如下,在机器A上阻止目的ip是机器B且端口是23的数据包发出。
1sudo iptables -A OUTPUT -d 192.168.164.130 -p tcp --dport 23 -j DROP
如下图,可以看到,连接不能成功
Prevent B from doing telnet to Machine A.本项实验需要用iptables实现阻挡机器B用telnet 连接机器A,命令如下,在机器A上阻止来源IP是机器A且端口是23的数据包进入。
1sudo iptables -A INPUT -s 192.168.164.130 -p tcp --dport 23 -j DROP
如下图,可以看到,连接 ...
PE文件与功能
PE头DOS头64个字节
DOS-stub
PE头Signature
FileHeader字段1234567891011121314151617typedef struct _IMAGE_FILE_HEADER {WORD Machine;//运行平台WORD NumberOfSections;//文件的区块数目DWORD TimeDateStamp;//文件创建的用时间戳标识的日期DWORD PointerToSymbolTable;//指向符号表(用于调试)DWORD NumberOfSymbols;//符号表中符号的个数WORD SizeOfOptionalHeader;//IMAGE_OPTIONAL_HEADER32结构大小WORD Characteristics;//文件属性} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
OptionalHeader123456789101112131415161718192021222324252627282930313233typedef struct _IMAGE_OPTI ...
Java虚拟机之类加载机制
验证文件格式验证这阶段的验证是基于二进制字节流进行的,只有通过了这个验证,这段字节流才允许进入Java虚拟机内存的方法区中进行存储。
元数据验证对字节码描述的信息进行语义分析,主要是对类的元数据信息进行语义校验。
字节码验证主要目的是通过数据流分析和控制流分析,确定语义是合法的、符合逻辑的。
这个阶段对类的方法体(即Class文件的code属性)进行校验分析。
JDK6以后,Javac编译器和Java虚拟进行了联合优化,尽可能多的校验辅助措施挪到了Javac编译器进行。
具体表现是Code属性中多了一个StackMapTable的新属性。
符号引用验证发生在虚拟机将符号引用转化为直接引用的时候,这个转化将在连接的第三阶段,即解析阶段完成的。
准备准备阶段是正式为类中定义的变量(static)分配内存并设置变量初始值的阶段。
解析解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程