前言
2019inCTF的rce-auditor的环境搭建到解决的详细过程
0x02 rce-auditor
环境的文件目录如下:
下面是每个目录和文件的介绍。
docker
目录存放的是环境的基本文件,而exploit
存放的是解决该问题的文件,下面将从docker
目录开始详细的每一个文件的内容。
docker
目录下的flag
目录。
flag
文件的内容是你要通过利用获取的。readflag
文件是编译好的二进制文件的,要通过拿到shell执行它获取flag
的内容。readflag.c
文件是编译之前的readflag
的.c
文件,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
FILE *f = fopen("/flag", "r");
char buf[256] = {0};
fgets(buf, 256, f);
puts(buf);
fclose(f);
return 0;
}
docker
目录下的nginx
文件夹。
default
文件是nginx
的配置文件,内容如下:1
2
3
4
5
6
7
8
9server {
listen 80;
server_name _;
location / {
include proxy_params;
proxy_pass http://unix:/home/user/sock/server.sock;
}
}
这个配置文件是代理80
端口的将http
请求代理到unixsocket
。
docker
目录下的redis
文件夹。
redis.conf
文件是redis
的配置文件。
docker
目录的user
文件夹。
pow
目录暂时没有东西。sock
目录暂时没有东西。chrome_headless.py
的内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#!/usr/bin/env python3
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import TimeoutException, WebDriverException
loading_page_time_sec = 5
browsing_page_time_sec = 5
def browse(url):
options = Options()
options.headless = True
options.add_argument('--no-sandbox') # https://stackoverflow.com/a/45846909
options.add_argument('--disable-dev-shm-usage') # https://stackoverflow.com/a/50642913
chrome = Chrome(options=options)
# https://stackoverflow.com/a/47695227
chrome.set_page_load_timeout(loading_page_time_sec)
chrome.set_script_timeout(loading_page_time_sec)
try:
chrome.get(url)
time.sleep(browsing_page_time_sec)
except (TimeoutException, WebDriverException):
pass
finally:
chrome.quit()
下面大体介绍一下这个函数:
2~6
行主要导入所需的模块。8
行设置了请求页面时的超时时间。9
行设置了执行javascript脚本超时时间。12
行初始化chrome
的设置参数实例。13
行设置浏览器为无界面运行。14
行设置浏览器为非沙盒模式运行。15
行详细链接16~19
将上面提到的参数设置到chrome
中。21
模仿浏览器发起get请求。22
进程阻塞了5
秒。26
行关闭所有的窗口。
config.py
的内容如下:
1 | #!/usr/bin/env python3 |
是一个基本配置。
eval_server
是eval_server.c
编译后的二进制文件。
eval_server.c
的内容如下:
1 |
|
大家可以自己运行一下看看结果。
powser.py
的内容:
1 | #!/usr/bin/env python3 |
详细介绍请戳这里
run.sh
的内容如下:
1 |
|
下面是上面文件的详细介绍:
3
行设置了dev/shm
的权限为rwsx-rx-rx
。6
行启动redis
服务器。9
行设置环境变量LANG=C.UTF-8
解决乱码。10
行设置是为了去除所有本地化的设置,让命令能正确执行。11~13
行用sudo
提升到user
用户去启动4
个后台队列处理redis
服务,基于unixsocket
,运行在内网中。16
行在连接到127.0.0.1:6666
时自动启动eval_server
。19
行重启nginx
服务器。22~29
行用这个gunicorn
来管理starlette
。
参考链接
https://outmanzzq.github.io/2018/09/11/chmod-in-linux/
web_server.py
的内容如下:
1 | #!/usr/bin/env python3 |
详细介绍请戳这里
docker-compose.yml
的内容如下:
1 | version: "2.2" |
详细介绍请戳这里
Dockerfile
的内容如下:
1 | FROM ubuntu:18.04 |
下面来详细的介绍一下:
1
行是使用的基础镜像。2
行是作者名。6
行是更新可获得的包的列表。7
行通过下载更新后列表的包。9~14
行通过apt
下载软件包。16~22
行通过pip3
下载软件包。25
行创建一个不带/home
目录和配置文件的flag
用户。26
行复制flag/flag
的文件到/flag
目录。27
同上。28
修改这个目录用户和用户组为flag
。29
同上。30
修改/flag
文件的权限为文件所有者只读。31
行chmod 4755与chmod 755的区别在于开头多了一位,这个4表示其他用户执行文件时,具有与所有者相当的权限。34
行设置/tmp
和/var/tmp
的权限为rwx-rx-rxt
。36
行复制nginx/default
文件到/etc/nginx/sites-available/default
位置。40
行文件的复制和修改用户和用户组。43
行创建一个用户eval
不带/home
和配置文件。46
行将user
目录移动到/home/user
目录。47
行创建user
用户同43
行。49
行将redis
用户添加到user
用户组。51
行同上。52
行同28
行。53
行同28
行。54
行设置/home/user/pow
目录的权限为rwx------
。56
行设置user
用户执行/home/user/eval_server
时用eval
用户的权限,并且用sudo时不用输入密码。58
暴露的端口为80
。60
设置工作目录为/home/user
。61
行运行run.sh
。
参考链接
https://outmanzzq.github.io/2018/09/11/chmod-in-linux/
exploit
目录的index.html
文件的内容如下:
1 | <script> |
Writeup
这个内部服务器监听在localhost:6666
将从输入中读取内容并在shell
中逐行执行。但是,Chromium
(和Firefox
)将会阻止到端口6666的任何访问由于ERR_UNSAFE_PORT
。它旨在保护用户免受协议走私攻击。
因此,基于HTTP的请求(XHR/fetch/html)将无法发送。我们必须利用其他的协议。尽管Chromium
支持ftp
协议,但是利用ftp
协议走私是很困难的。
如今,现代的浏览器支持WebRTC API,这个API旨在建立对等连接。在协商过程中,将使用STUN协议来选择ICE candidates。
但是它不是简单的。
在初始化WebRTC TURN
服务器时指定用户名和密码将不起作用,因为TURN握手已经考虑到此协议走私攻击。
- 尽管用户名和密码是可控的,但这不是浏览器发送的第一个数据包。
- 除非浏览器收到有效的响应,否则它将不会发送包含用户名和密码的身份验证数据包。
- 我们无法控制第一个握手包中的任何字节。