# 9.3 命令执行检测算法

# 9.3.1 堆栈检测算法

不管是在离线分析还是在实时检测中,本算法都是RASP中使用最为广泛的算法之一。 算法的检测原理也比较简单,当执行到命令执行时,获取当前调用栈,如果调用栈中存在非法栈,即可判定为攻击。 对于已经出现过的漏洞或者攻击的栈特征总结处特征。常用的非法攻击栈如下:

// 栈特征来源于OpenRasp
com.thoughtworks.xstream.XStream.unmarshal
java.beans.XMLDecoder.readObject
java.io.ObjectInputStream.readObject
org.apache.dubbo.common.serialize.hessian2.Hessian2ObjectInput.readObject
com.alibaba.fastjson.JSON.parse
com.fasterxml.jackson.databind.ObjectMapper.readValue
payload.execCommand
net.rebeyond.behinder
org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute
freemarker.template.utility.Execute.exec
freemarker.core.Expression.eval
bsh.Reflect.invokeMethod
org.jboss.el.util.ReflectionUtil.invokeMethod
org.codehaus.groovy.runtime.ProcessGroovyMethods.execute
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call
ScriptFunction.invoke
com.caucho.hessian.io.HessianInput.readObject
org.apache.velocity.runtime.parser.node.ASTMethod.execute
org.apache.commons.jexl3.internal.Interpreter.call
javax.script.AbstractScriptEngine.eval
javax.el.ELProcessor.getValue
ognl.OgnlRuntime.invokeMethod
javax.naming.InitialContext.lookup
org.mvel2.MVEL.executeExpression
org.mvel.MVEL.executeExpression
ysoserial.Pwner
org.yaml.snakeyaml.Yaml.load
org.mozilla.javascript.Context.evaluateString
command.Exec.equals
java.lang.ref.Finalizer.runFinalizer
java.sql.DriverManager.getConnection
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

上面为攻击利用栈列表,一般选取具有较高执行权限的类和方法。 栈特征是从已知漏洞利用链上总结提取出来的特征,因此该算法不能很好的解决未知漏洞的威胁。

# 9.3.2 反射执行命令

正常的用户也有命令执行的需求,但是一般的正常用户执行命令时不会使用反射,因为直接调用命令执行的api更加简单快捷并且反射性差。 看如下调用栈,这是一段用户正常的命令执行:

场景:直接调用命令执行API

java.lang.ProcessImpl.start(ProcessImpl.java)      [1]<-----命令执行
java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
java.lang.Runtime.exec(Runtime.java:620)
java.lang.Runtime.exec(Runtime.java:485)
com.alibaba.inf.cto.util.ProcessInfoUtil.getSystemInfoByCommand(ProcessInfoUtil.java:256)  [2]<-----用户代码
com.alibaba.inf.cto.util.ProcessInfoUtil.getHostInfoByIp(ProcessInfoUtil.java:242)
com.alibaba.adsc.predict.monitor.ponitor.getHostName(PMonitor.java:105)
com.alibaba.adsc.predict.monitor.ponitor.lambda$makeSureExist$0(PMonitor.java:94)
com.alibaba.adsc.predict.monitor.ponitor$$Lambda$427/2097793174.run(Unknown Source)
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
java.util.concurrent.FutureTask.run(FutureTask.java:266)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

用户正常的命令执行特征:用户代码直接执行了命令,中间无反射操作,是正常的业务命令执行。如果用户代码与命令执行代码之间有反射的调用栈,可以判定为攻击或者后面。

# 9.3.3 用户输入参数匹配

检测用户命令执行的参数是否在用户的输入参数中,即用户输入参数是否可以控制命令,用户的输入包括:http参数、cookie和header等。

# 9.3.4 检测常用的渗透命令

常用的渗透命令列举部分如下:

whoami
wget
echo
touch
pwd
// 其他可以参考jrasp命令执行模块的参数
1
2
3
4
5
6

除了以上几种检测算法,还可以将系统所有的命令执行都记录并上报日志,作为离线分析或者安全极限。