Hackthebox bagel.dll 代码审计
利用ilspy将bagel.dll打开
关于此目录有可以说的内容
目录解析
最上方的bagel是组装名字(assemble name)
bagel_server 是命令空间(namespace)
下一级分支是类如File,Base,Handler,Orders等(class)
反序列化导致的命令执行漏洞代码审计思路
首先看主程序Bagel
1.通过明显的英语翻译可以看到main函数执行了两个函数一个是initialzieserver()和startserver(),初始化服务和开启服务 服务为wsserver(websocket)
值得关注的是初始化服务中存在MessageReceived(),根据下方关于messagerecevied函数的设计,可以知道此函数利用了handler类中的deserialize方法和serialize方法(反序列化函数)
而此反序列化函数获取到的内容是json格式的内容。
因此跳转到handlerle类中看deserialize函数是否被重写
Handler类
可疑点
1.看到存在typenamehandling=4的设置
2.反序列化的语句是JsonConvert.DeserializeObject<Base>(json,val);
反序列化的对象是从Base类获取的key-value值
观察Base类
关注点:
1.Base类继承于Orders类,因此继承父类的所有公共函数(public函数)
2.userid和session都是私有成员,且session为Unauthorized
观察Orders类
提炼:
1.orders类存在三个私有成员filename、order_info和new一个file类
2.存在三个公有函数RemoveOrder、WriteOrder、ReadOrder
其中Readorder读取文件内容存在目录路径过滤
writeOrder函数使用get时直接返回writefile内容
RemoveOrder函数仅仅设置了getter、setter
Order类内new了一个FIle类,因此可以使用File类设置的函数
观察File类
提炼:
1.存在两个类为ReadFile和WriteFile
调用readcontent和writecontent函数进行读写操作
因此我们可以确定一个路径,如下图
图片来源:0xdf 师傅
需要注意的是使用getter时是不需要参数的情况下,如果调用setter就是传了一个参数才会调用