Yunoon的文章

记录一次关于CTFd搭建所踩的坑

0 条评论 笔记 CTFd搭建 Yunoon

前言

协会的任务罢了~

步骤

  1. 虚拟机搭建
  2. Docker、Docker-composer 安装 Docker swarm 启用
  3. 拉取项目 注意:这里https://github.com/xxxxxx如果因为国内访问吃力,可以换成git://github.com/xxxxxx。
  4. 部署 docker-compose up -d

实践

  1. 看起来很简单对吧,接下来,会遇到版本不匹配、apt-get换源、权限不够、redis地址异常等问题。痛苦的搭建体验。ValueError: Redis URL must specify one of the followingschemes (redis://, rediss://, unix://)

  2. 当然,在搭建官方版还是十分轻松愉快的,拉取镜像后,可能会出现“权限不够的情况”,只需要在docker-composer.yml中的每一个容器添加privileged: true
    就可以直接跑起来了。

    这时可以看看相关的容器情况docker container ls
    (原谅远程windows没有Xshell,XD)
    还可以看看容器运行情况docker stats

《 突 然 成 功 了 》

  1. 写到一半,突然项目就成功运行起来了。
  2. 这里把对ctfd-whale的插件项目安装步骤说明一下。
  3. 前面写的包错都是基于对Dockerfile内的镜像进行了修改才出现的问题,原项目作者的教程是极其细致且准确的。CTFd-Whale 推荐部署实践
  4. 这里将记录下后面搭建成功的流程


  1. 环境:Mac Bigsur 11.5.1,Linux也可。
  2. 使用代理export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890这里用了Clash代理,如果有代理的可以替换相应的端口,无代理可将https替换为git。
  3. 拉取项目 git clone -b single https://github.com/glzjin/CTFd.git
  4. token随机,docker-composer启动容器,最好不要进行更改!!!这里只有两处的修改就是对于requests.txt中的gevent版本进行修改,不然会出现编译失败的情况。具体包错原因这里没有分析,这里通过Google查询到可以对gevent版本进行更新,这是在上面修改了镜像的情况下出现包错的解决方案之一,没想到用到这里了XD。这里是对原有gevent版本进行替换后另外添加了greenlet包。修改为:gevent==1.1.0替换为gevent==1.3.4,添加greenlet==0.4.13
    以及对于Dockerfile中的python版本进行了添加,原有镜像中无法找到python、python-dev的安装包了。将pythonpython-dev更改为python3python3-dev
  5. 这里对项目的修改就结束了,然后就直接docker-composer up -d即可构建docker容器。

成果展示

  1. 成功搭建页面

成功但没完全成功

在安装成功后,发现注册不行,处于无限加载的状态,进docker查看日志发现了报错。

在issue上发现了同样的问题

随后追踪到了frankli0324的项目,在其使用指南中开始从头开始安装。

正式搭建完成

  1. 拉取官方镜像git clone https://github.com/CTFd/CTFd.git
  2. conf下创建frp文件夹mkdir./conf/frp
  3. frp文件夹下,创建frpc.inifrps.ini

    frpc.ini

    [common]
    token = randomme#切记需要更改!!!
    server_addr = 172.1.0.1
    server_port = 6490
    pool_count = 200
    tls_enable = true
    admin_addr = 172.1.0.3
    admin_port = 7400

    frps.ini

    [common]
    bind_port = 6490
    token = randomme #切记需要更改!!!两个文件内token一致
  4. 添加2个虚拟网段,其中一个作为FRPCCTFD两个容器连通,另一个供FRPC访问题目容器。

    networks:
        frp_connect:
    driver: bridge
    internal: true
    ipam:
    config:
    - subnet: 172.1.0.0/16
    frp_containers:
    driver: overlay
    internal: true # 如果允许题目容器访问外网,则可以去掉
    attachable: true
    ipam:
    config:
    - subnet: 172.2.0.0/16
  5. 分别创建FRPC FRPS 2个服务,将新建的网段添加给相应的服务

    services:
        frps:
    image: glzjin/frp
    restart: always
    volumes:
    - ./conf/frp:/conf
    entrypoint:
    - /usr/local/bin/frps
    - -c
    - /conf/frps.ini
    ports:
    - 10000-10100:10000-10100 #映射direct类型题目的端口
    - 8001:8001 # 映射http类型题目的端口
    networks:
    default: # 需要将frps暴露到公网以正常访问题目容器
    frp_connect:
    frpc:
    image: glzjin/frp:latest
    restart: always
    volumes:
    - ./conf/frp:/conf/
    entrypoint:
    - /usr/local/bin/frpc
    - -c
    - /conf/frpc.ini
    depends_on:
    - frps #frps需要先成功运行
    networks:
    frp_containers: # 供frpc访问题目容器
    frp_connect: # 供frpc访问frps, CTFd访问frpc
    ipv4_address: 172.1.0.3
  6. 然后执行命令docker-compose up -d,即可等待搭建完成。

总结

这次搭建花费的总时间还是挺长的,起初的配置glzjin的镜像,后面通过了issue使用了frankli0324插件,最后通过2位大佬的配置文件重新自己配置,whale插件使用的是frankli0324fork的项目,但其frp的配置似乎有些出入。在了解了docker网络配置后,结合glzjinfrp项目,成功搭建CTFd平台以及安装CTFd-whale插件。


Miku 生日快乐

0 条评论 默认分类 小记录 Yunoon

未命名作品
摸了好久的鱼出来的画hhhhh


利用AltStore做到iPad免越狱即可安装应用的实践记录

0 条评论 默认分类 笔记 黑果日记 Yunoon

前言

在iPad上安装应用,大多数情况只能通过App Store下载。但有很多个人开发者的项目尚未发布上线在AppStore内,因此便有了AltStore这款应用。

知识点

Apple开发者ID
AltStore的使用

实践

  1. 在Windows/MacOS上安装AltServer。

  2. 安装邮箱插件

  3. 打开邮箱偏好设置,选择管理插件,启用该插件。

  4. 登陆Apple ID

  5. 通过有线连接,在访达中找到并且启用接入Wi-Fi时显示此iPad

  6. 选择安装后,即可在iPad上找到AltStore

    IMG_5FF13451E2BA-1

  7. 在设置中,选择并且相信您的Apple IDIMG_3B05717BB672-1

  8. 最后在选择您的ipa文件,分享至AltStore即可安装。IMG_A6CD5C350BC7-1

  9. 至此就可以安装ipa应用至iPad上。但每隔7天需要刷新使用时间,个人开发者用户的APP有效时间为7天,每隔7天需要重新申请。当然,也可以保持您Windows/MacOS上的AltStore与邮箱开启,AltStore会自动刷新。
    IMG_5C2B2E61C995-1

结束

以上就是本次的利用AltStore安装个人开发APP在iPad上的全过程,感谢您的观看。


记录一次关于苹果生态的搭建以及使用体验

0 条评论 默认分类 黑果日记 Yunoon

前言

这个假期成功完善了苹果生态的最后一块拼图,入手了iPad Pro 2018 + Apple pencil II + AirPods II,并且对黑果网卡进行了完善,实现了较好的体验,在这里写下总结以做纪念。

起因

黑苹果从高中就开始接触了,当时看着学长搞黑苹果,自己尚未参与有些许遗憾,就在某个晚上突发奇想开始研究黑苹果搭建。

奇妙的虚拟机体验

说到第一个黑果,当时首先就搭建在Vmware上,首先要先在VMware上添加插件只能支持dmg安装。具体操作建议直接百度/Google,后续可能会写相应的操作(咕咕咕)。当然也可以尝试直接用别人打包好的VMware包,解压就能用,这个会贴上链接(咕咕咕)。
但说到底,VMware上的使用体验并不好,虽然也有VMware虚拟显卡驱动支持,但那可怜的2M显存,缩放都吃力,仅推荐玩玩就行,Mac 桌面体验器。

第一次正式搭建尝试

最先就是在52上看到了一篇文章:黑苹果系统 macOS Catalina 10.15.7 安装镜像DMG和RAW下载,就兴趣使然开始逐步学习,照着教程逐步操作.

在看了查阅了相应的教程后,就开始动手操作了:
(以下操作都建立有一定黑苹果知识的情况下)

  1. 改硬盘分区格式,MBR改为GPT,通过DiskGenius就能更改。
  2. 使用etcher刻录镜像
  3. 重启进入UEFI引导界面,狂按F12/Delete,就可以看到U盘的选项,进入即可。
  4. 在这里如果无法进入Mac引导界面,就说明EFI配置文件并不适合你的设备,需要自行更改,或者在网上找到与您机型相匹配的EFI文件,当您成功进入安装界面,就可接着进行后续的操作。
  5. 在工具中将那块SATA SSD刷为APFS格式,就可以刷入苹果系统了。
  6. 当然总不可能每次都要插U盘来启动黑苹果,这时就需要通过分区工具创建一个EFI分区,将U盘配置文件移入这个分区内,建议300M~500M。
  7. 这时您UEFI引导界面就会有一个内置的UEFI,后续对config文件的修改也会通过这个分区来修改。
  8. 对EFI修改时,当然也可以使用更为稳定的方法,可以通过U盘来驱动已修改过的EFI,来进行测试,这样哪怕您的EFI修改错误,分区内的EFI也还是能够使用。

不知不觉就写成教程的语态了XD

当时,第一次安装当然不会这么流畅,安装成功只是黑果的开始。
接下来就是对config文件进行配置,比如相应的声卡、显卡注入,i5 8600k核显为UHD620,在10.13.6后就不支持GTX系的显卡,当时配置为10.15.7就在配核显内存注入上卡了很久,最后还是退回了10.13.6,还是显卡驱动香。

主机配置:
CPU:i5 8600k
主板:MSI Z370 银蛇环
硬盘:SSD SATA 影驰 120G
EFI文件放文后

小新15Air 吃上黑果

在第一次尝试成功后,就打算让笔记本也上Mac系统,这个过程当然是痛苦的,其中还付费寻求了大佬的帮助,最终确定是硬盘的问题。通过硬盘屏蔽的方式得以成功驱动。
还是概述一下流程
刻盘->配置EFI->成功驱动->格式化硬盘->刷入系统->创建盘内EFI分区
一套流程,说难不难,说简单也需要一定的门槛,如果能找到您的机型对应的EFI,则可以成功驱动。最坏的情况,就需要定制EFI,这就需要学习Opencore相应的配置以及hackintool的使用。

Intel网卡的使用

在付费安装完成后,网卡使用的是Intel 9560AC,Mac官方是不支持Intel网卡免驱,这里就用到了itlwm,通过添加相应的kext文件和配置config文件用于加载kext,以及安装itlwm驱动后就可以驱动Intel网卡。

免驱网卡

非原生网卡驱动使用还是些许瑕疵,在这个暑假就上了DW1820A,成功实现了


[Hack The Box]emdee five for life

0 条评论 默认分类 HackTheBox Yunoon

知识点

  • 竞争条件

开工

进入到页面后提示需要将当前所给的字符串MD5加密后传输

尝试手动提交发现出不了结果,这里就可以考虑使用Python脚本进行传输

import requests
from hashlib import md5
import re



def encrypt(a):
    m = md5()
    m.update(a.encode('utf-8'))
    enc_a = m.hexdigest()
    data = {
        "hash":enc_a
    }
    return data

def find(url):
    res = requests.get(url).text
    pattern = re.compile(r'<h3 align=\'center\'>(.+?)</h3>')
    return pattern.findall(res)[0]

def find_txt(txt):

    pattern = re.compile(r'<h3 align=\'center\'>(.+?)</h3>')
    return pattern.findall(txt)[0]

def find_flag(txt):
    pattern = re.compile(r'<p align=\'center\'>(.+?)</p><center>')
    return pattern.findall(txt)[0]

def send(url):
    data = encrypt(find(url))

    res = requests.post(url=url,data=data,headers=headers).text

    data1 = encrypt(find_txt(res))
    
    res1 = requests.post(url=url,data=data1,headers=headers).text
    print(find_flag(res1))


if __name__ == '__main__':
    
    url = "http://46.101.74.114:32141/"
    headers = {
        'POST': '/ HTTP/1.1',
        'Content-Length': '37',
        'Cache-Control': 'max-age=0',
        'Upgrade-Insecure-Requests': '1',
        'Origin': url,
        'Content-Type': 'application/x-www-form-urlencoded',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Referer': 'http://46.101.74.114:32141/',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cookie': 'PHPSESSID=itc987r7eesb6cg623hhc0ut35',
        'Connection': 'close'
    }
    while 1:
        send(url)


在特定情况下,如时间,就可以拿到flag