前提知识
- file_server
一个静态文件服务器,支持真实和虚拟文件系统。它通过将请求的URI路径附加到站点的根路径来形成文件路径。
默认情况下,它执行规范的URI;这意味着HTTP重定向将被用于对不以尾部斜线结尾的目录的请求(添加它)或对有尾部斜线的文件的请求(删除它)。然而,如果内部重写修改了路径的最后一个元素(文件名),则不会发出重定向。
最常见的是,
file_server
指令与root指令配对,为整个网站设置文件根。一个站点的根并不带有沙盒保证:文件服务器确实可以防止目录遍历,但是根中的符号链接仍然可以允许根之外的访问。
- root设置网站根目录。它类似于root指令,只是它只适用于这个文件服务器实例,并优先于任何可能已经定义的其他站点根目录。默认:{http.vars.root}或当前工作目录。注意:这个子指令只改变这个指令的根。其他指令(如try_files或templates)要指定根目录,请使用root指令而不是这个子指令。
靶场搭建
提前在docker把caddy:2.4.5-alpine给pull下来了
这里出现了一个问题,解决方案如下
卷已声明为外部卷,但找不到
1. external volume "caddy_data" not found 2. 3. docker volume create caddy_data 4. 5. docker compose up -d
成功创建镜像
漏洞复现
这里需要修改本地的hosts文件
1. /C=DK/O=Kalmarunionen/CN=*.caddy.chal-kalmarc.tf 2. 192.168.10.143 www.caddy.chal-kalmarc.tf
我们先看docker-compose文件
1. mkdir -p backups/ && 2. cp -r *.caddy.chal-kalmarc.tf backups/ && 3. rm php.caddy.chal-kalmarc.tf/flag.txt
在backups目录下将部分文件备份了一次,并且删除了flag.txt,此时我们可以到backups下面的php.caddy.chal-kalmarc.tf文件夹中获取flag.txt,运行目录在
www.caddy.chal-kalmarc.tf
,需要我们进行目录穿梭
我们再来看Caddyfile
1. *.caddy.chal-kalmarc.tf { 2. encode zstd gzip 3. log { 4. output stderr 5. level DEBUG 6. } 7. 8. # block accidental exposure of flags: 9. respond /flag.txt 403 10. 11. tls /etc/ssl/certs/caddy.pem /etc/ssl/private/caddy.key { 12. on_demand 13. } 14. 15. file_server { 16. root /srv/{host}/ 17. } 18. }
file_server
: 这个配置启用了Caddy的文件服务器功能,它允许Caddy提供网站的静态文件。root
指定了网站文件的根目录。{host}
表示Caddy将使用来访问网站的主机名作为子目录名称,这使得Caddy可以为每个网站提供单独的文件根目录。
这里我们尝试跨目录获取flag
首先我们发现在php.caddy.chal-kalmarc.tf的index.php内容如下
|
1. <?php 2. echo "I can't get this to work :/"; 3. echo system("cat flag.txt"); 4. ?>
我们直接目录穿梭获取该目录下的flag.txt
/
..
/
flag.txt
也可以翻翻后续的补丁查找当前版本的漏洞
https://github.com/caddyserver/caddy/releases/tag/v2.4.6
- Path matchers unescape/clean URI paths to normalize match space
- Fix regex matching in
map
handler
/
/
flag.txt