从SCTF看nginx配置问题
题目源码:https://github.com/cL0und/sctf2018-NginxSecret
功能探索
题目hints
1 | hint4:/editxxxxx怎么也能访问? |
首先注册,然后登陆,发现一些功能
UserInfo & EditMyinfo
访问/user/admin
修改后的info会在Userinfo显示
Write_your_plan
说是Write down your secret plan. Rest assured that no one will see you.
Import_and_Export
将之前的plan以xml文件形式下载下来
nginx错误配置
在/static发现
于是想到目录穿越
参考https://www.leavesongs.com/PENETRATION/nginx-insecure-configuration.html#_1
访问/static../etc/passwd发现能够下载/etc/passwdhttp://149.129.103.103:4455/static../etc/passwd
于是下载nginx配置文件http://149.129.103.103:4455/static../etc/nginx/nginx.conf
内容如下
1 | user www-data; |
配置文件内容的详解
出现目录穿越漏洞的代码
1 | location /static { |
解释一些代码location ~* \.(css|js|gif|png)
表示访问css|js|gif|png就会生成缓存文件proxy_cache_path /tmp/mycache
缓存文件路径/tmp/mycache
levels
设置缓存文件目录层次;levels=1:2
表示两级目录keys_zone
设置缓存名字和共享内存大小inactive
在指定时间内没人访问则被删除max_size
最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。use_temp_path
: 如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储proxy_cache_key
不设置默认为 $scheme$proxy_host$uri$is_args$args;
即 文件名为MD5($scheme$proxy_host$request_uri)
,比如访问http://149.129.103.103:4455/post_bug/a.png
,则缓存文件名为MD5(http://bugweb.app:8000/post_bug/a.png/)
即2b47096d5dd14815ce241bfca907de59
由于proxy_cache_path设置了levels=1:2,因此缓存文件存在/tmp/mycache下的两级目录下,第一级目录名取MD5值的最后一个字符,第二级目录名取MD5值的倒数2、3个字符,例如/tmp/mycache/b/43/6fcfa7b1e6bad837b70dc98c9b82b43b,再通过任意文件读取即可读到缓存文件的内容。
奇怪的路由
根据hints/editxxxxx怎么也能访问?
/editxxxxx
也能访问/edit
于是/write_planxxxx
也能访问/write_plan
于是可以构造http://149.129.103.103:4455/write_plan/hu3sky.js
提交到write_plan页面,这样admin就会去访问,就会生成缓存文件
即14c9bb58ef96d9d55b56950fd8cd28f7
于是访问http://149.129.103.103:4455/static../tmp/mycache/7/8f/14c9bb58ef96d9d55b56950fd8cd28f7
下载缓存文件
发现ftp用户名/密码syc10ver Eec5TN9fruOOTp2G
XXE
拿到ftp密码,该服务器上无ftp服务。于是想还有内网服务器,所以利用import_and_export
的xxe来读取路由表/proc/net/arp
根据下载下来的xml文件构造payload
1 | <?xml version="1.0" encoding="UTF-8"?> |
读到内网还有3个ip
于是对这几个ip尝试用ftp协议
1 | <?xml version="1.0" encoding="UTF-8"?> |
读到flag文件在172.18.0.4
接着读flag
1 | <?xmlversion="1.0" encoding="UTF-8"?> |