2020西湖论剑部分复现+另外几道Web题

西湖论剑题目质量算挺高的了,是那种贴近真实环境的题目,以至于质量高到完全看不懂(除了Misc感觉比较离谱 下面都是赛后复现了,比赛的时候还是开心的签了一下到,总结:比赛体验很不错,网速很给力,下次还来 Misc yusa_yyds 附件下载:链接 是一个Wireshark流量文件,打开一看是USB数据包。比赛的时候搜了半天只找到了键盘和鼠标的东西,赛后看wp发现是Xbox 360手柄。。。 那是怎么找到的呢?下面是对着WP+自己找的资料进行的总结: 首先是USB的地址格式: 摘自https://bbs.zafu-polaris.cn/d/13-2020-usbyusa-yyds 常见地址格式为 X.Y.Z X表示USB总线ID 对应的过滤值为usb.bus_id Y表示USB设备ID 对应的过滤值为usb.device_address Z表示USB设备的端口 所以从流量包的前一段很容易发现是在读取USB设备列表,因为每次GET DESCRIPTOR的地址都不同。然后搜索发现在GET DESCRIPTOR Response DEVICE返回的是设备的类型,包含设备生产商、设备名称等信息: 由于后面的数据包传输对象地址都是2.15.2,所以只需要关注2.15开头的设备即可。可以看见2.15.0的GET DESCRIPTOR Response DEVICE返回值里面出现了Microsoft和Xbox360 Controller字样。所以可以确定后续的数据包都是Xbox360手柄产生的。 然后开始查看传输的数据包。关注每个数据包的LCD(Leftover Capture Data),可以发现大体的数据包格式:000800ff00000000和0008000000000000,然后从这个链接中找到了Xbox360传输数据包的格式,发现这是震动的数据包,下面是网站中的说明: A type byte of ‘0x00’ indicates a rumble packet. The controller contains two rumble motors: a large weight in the left grip and a small weight in the right grip. The value for both of these motors is updated in a single packet....

Oct. 13, 2020 · 12 min · 2357 words

PHP反序列化姿势总结

最近工作室招新,所以又重新捡起了PHP,做了一些反序列化的题目,又学到了一些Tricks,在这里稍微总结一下。 序列化字符串中的字母含义 有关序列化字符串中的字母含义,在这篇文章里面已经说的很清楚了(大佬tql,PHP源码都看了一遍),这里稍微再总结一下: a - array:数组 b - boolean:布尔值 d - double:浮点数 i - integer:整数 o - common object:PHP3时被用来代表序列化对象,但是PHP4被O取代 r - reference:对象引用 s - non-escaped binary string:无转义字符的字符串 S - escaped binary string:带有转义字符的字符串 C - custom object:不知道干啥用的,从来没碰到过 O - class:普通的类 N - null:NULL值 R - pointer reference:指针引用 U - unicode string:Unicode字符串 下面总结一些类型的特点: 整数i:整数的范围为从-2147483648 到 2147483647,若序列化时的数字超出该范围,则直接转换为浮点数;若反序列化时数字超出该范围,则无法得到期望数值。 浮点数d:浮点数可以表示成整数形式、浮点数形式和科学技术法形式,正负无穷大数被序列化时返回INF和-INF,若反序列化时数字超出PHP的表示范围,也返回INF;若反序列化时数字的精度超出PHP的最小精度,则返回0;若序列化时为非数,则返回NAN,NAN被反序列化时输出为0。 在s、S、O等存在字符串长度的对象中,字符串长度值不能为负数,允许字符串长度的值带有+号,如s:+5:"value";。 S是PHP6新引进的一种字符串序列化方式,它允许字符串以转义字符的情况出现(\+字符对应16进制数),如protected对象成员名可序列化为S:5:"\00*\00value";,其中\00即代表chr(0)字符(此处必须要两位\00,如果使用\0会引发Unserialize Error)。 关于对象引用r和指针引用R: 这两者在引用方式上是有区别的,可以理解为对象引用是一个单边的引用,被赋值的那个变量可以任意修改值,而不会影响到被引用的那个对象;而指针引用则是一个双边的引用,被赋值的那个变量若做了改动,被引用的那个对象也会被修改。也就是说指针引用其实就是两个对象指针指向了同一块内存区域,所以任一指针的数值修改其实都是在对这块内存做修改,也就会影响到另一个指针的值;而对象引用的被赋值对象就像一个临时的指针,指向了被引用对象的内存区域,而当被赋值对象的值修改之后,这个临时指针就指向了另一块内存。下面是两段示例代码: class SampleClass { var $value; } $a = new SampleClass(); $a->value = 1; $b = new SampleClass(); $b->value = $a; // 对象引用 echo "<pre>"; var_dump($a); var_dump($b); $a->value=2; // 被引用对象的修改 var_dump($a); var_dump($b); $b->value=3; // 被赋值对象的修改 var_dump($a); var_dump($b); echo "</pre>"; class SampleClass { var $value; } $a = new SampleClass(); $a->value = 1; $b = new SampleClass(); $b->value = $a; // 对象引用 echo "<pre>"; var_dump($a); var_dump($b); $a->value=2; // 被引用对象的修改 var_dump($a); var_dump($b); $b->value=3; // 被赋值对象的修改 var_dump($a); var_dump($b); echo "</pre>"; 下面是两端程序输出的差异:...

Sep. 25, 2020 · 2 min · 339 words

T-Star 2020 靶场赛 WriteUp

昨天开始的靶场赛,全是Web,除了最后两个SQL注入没做出来,其他全做出来了+复现出来了,这里记录几个比较有意思的题目。 你能爆破吗 首页有个登录界面,随便输入会返回查询的语句,可以发现存在特殊字符转义没办法注入。于是尝试用户名和密码均输入admin,显示如下界面: 发现服务器将刚才输入的用户名作为Cookie储存了起来,base64解密后是admin: 尝试改为admin" or 1=1 limit 1,1#,发现输出改变,说明存在SQL注入: 于是使用联合注入,完整的注入过程如下: SELECT * FROM users WHERE username="xxx" order by 2# SELECT * FROM users WHERE username="xxx" order by 3# SELECT * FROM users WHERE username="xxx" order by 4# /* 报错 */ SELECT * FROM users WHERE username="xxx" union select 1,2,3# SELECT * FROM users WHERE username="xxx" union select 1,database(),user()# /* security, root@localhost */ SELECT * FROM users WHERE username="xxx" union select 1,group_concat(table_name),3 from information_schema....

Jul. 1, 2020 · 2 min · 384 words

GKCTF WriteUp

Web CheckIN 又是一道bypass disable_functions的题目 首先给出源代码: <title>Check_In</title> <?php highlight_file(__FILE__); class ClassName { public $code = null; public $decode = null; function __construct() { $this->code = @$this->x()['Ginkgo']; $this->decode = @base64_decode( $this->code ); @Eval($this->decode); } public function x() { return $_REQUEST; } } new ClassName(); 也就是只要输入base64加密的代码就能执行,执行phpinfo()发现版本为7.3,而且得到了一堆不能用的函数,能执行系统命令的都被ban了。 执行var_dump(scandir('/'));得到根目录有flag和readflag,flag文件读不到,readflag读出来是一个可执行文件,功能就是cat /flag。 也就是说,只要想办法执行这个文件就可以拿到flag。 然后就是写一句话代码执行,一开始用了蚁剑自带的bypass_disable_functions插件,但是好像在/var/www/html下面没有写权限所以都执行失败了。。。 后来发现了可以在/tmp上面上传文件然后包含,但是一开始没有找到能用的PoC。。。看WP找到一个pwn的PoC:https://github.com/mm0r1/exploits/blob/master/php7-gc-bypass/exploit.php 就RCE了,直接拿到flag: 更新: 后面再次尝试,发现只是插件不行,利用LD_PRELOAD环境变量劫持同样可以RCE:(更多请看我之前的文章) cve版签到 hint: cve-2020-7066 打开页面,在响应头中找到信息: Hint: Flag in localhost Tips: Host must be end with ‘123’ 结合CVE-2020-7066的详情: In PHP versions 7....

May. 24, 2020 · 5 min · 937 words

BJD3rd-WriteUp

Crypto bbcrypto # -*- coding:utf-8 -*- import A,SALT from itertools import * def encrypt(m, a, si): c="" for i in range(len(m)): c+=hex(((ord(m[i])) * a + ord(next(si))) % 128)[2:].zfill(2) return c if __name__ == "__main__": m = 'flag{********************************}' a = A salt = SALT assert(len(salt)==3) assert(salt.isalpha()) si = cycle(salt.lower()) print("明文内容为:") print(m) print("加密后的密文为:") c=encrypt(m, a, si) print(c) #加密后的密文为: #177401504b0125272c122743171e2c250a602e3a7c206e014a012703273a3c0160173a73753d 很容易找到6组明文和密文的对应关系: f(102)->0x17 l(108)->0x74 a(97)->0x01 g(103)->0x50 {(123)->0x4b }(125)->0x3d 由assert语句可以得到salt的长度为3且全为小写字母,且参与加密的是salt的循环迭代器,所以很容易在已知的明文-密文对中找到使用salt的同一位加密的一组或多组数据,比如这里的f和g、l、{和}。 于是可以小范围的爆破一下encrypt函数中的a: import string lower = string....

May. 23, 2020 · 4 min · 650 words

CTFd平台搭建记录

最近搭建了一个CTFd平台,花了差不多一个星期叭(虽然最后发现在一个小问题上卡了好久),用CTFd-Whale实现了独立题目容器,记录一下安装过程,避免以后再踩坑。 部署用的是最简单的Docker+Docker Compose部署,系统环境Ubuntu 18.04。 官方项目地址:https://github.com/CTFd/CTFd Docker与Docker Compose安装 Docker使用阿里云镜像源安装: 卸载老版本Docker: sudo apt-get remove docker docker-engine docker.io containerd runc 更新软件 sudo apt-get update 安装必备软件包 sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common 添加GPG密钥 curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - 查看密钥是否添加成功 sudo apt-key fingerprint 0EBFCD88 若添加成功,则将显示如下信息: 添加阿里云的软件源 sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" 若添加成功,则在/etc/apt/sources.list中可看见类似如下的记录: deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic stable 再次更新软件 sudo apt-get update 安装最新版的docker-ce sudo apt-get install docker-ce docker-ce-cli containerd....

Apr. 26, 2020 · 2 min · 379 words

Ha1cyonCTF WriteUp

最近搞的西工大CTF,整体题目感觉挺难的,看了WP之后发现Web还有一些很新的CVE,Misc还有音频隐写,都是没接触过的东西。除了服务器不定时的尿崩之外(运维挨打),做出来了几个题,也是第一次接触CTF的Crypto吧,记录一下收获。 Misc 抽象带师 真就人均狗粉丝嗷( Flag:NPUCTF{欢迎来到西北工业大学CTF比赛世界上最简单的比赛} Misc就做出来一道。。。真的难 Crypto 认清形势,建立信心 from Crypto.Util.number import * from gmpy2 import * from secret import flag p = getPrime(25) e = # Hidden q = getPrime(25) n = p * q m = bytes_to_long(flag.strip(b"npuctf{").strip(b"}")) c = pow(m, e, n) print(c) print(pow(2, e, n)) print(pow(4, e, n)) print(pow(8, e, n)) ''' 169169912654178 128509160179202 518818742414340 358553002064450 ''' 一道RSA的题目,由于输出的数字大小也不是很大,后面一点一点做着也就做出来了。 首先p和q都是25bit的素数,然后给出了加密后的密文和另外三个密文。经工作室的小伙伴一提醒,发现可以利用同余的性质求解出n: 若正整数$a_1,a_2,b_1,b_2$满足$a_1\equiv a_2(mod\space m),\space \space b_1\equiv b_2(mod\space m)$,则$a_1b_1\equiv a_2b_2(mod\space m)$。...

Apr. 22, 2020 · 3 min · 591 words

分组密码总结-DES,AES,SM4

简介 分组密码属于对称密码的一种,其特点是加解密都是对明文/密文进行分组后逐组进行加解密。通俗讲就是将明文分块,然后分块加密,解密同理。 分组密码的基本原理: 代换:明文分组到密文分组的可逆变换 扩散:将明文的统计特性散布到密文中去,使得明文的每一位影响密文中多位的值 混淆:使密文和密钥之间的统计关系变得尽可能复杂,使攻击者无法得到密钥,通常使用复杂的代换算法实现 分组密码体制基本上都是基于乘积(由一系列代换和置换构成)和迭代来构造的。常见的分组密码结构有Feistel网络和SP(Substitution Permutation)网络。DES算法和AES算法分别就是基于Feistel网络和SP网络实现的。 Feistel网络的加密过程为:将明文$x$一分为二,即$x=L_0R_0$,$L_0$是左边的$m$bit,$R_0$是右边的$m$bit,于是对于迭代次数$r$,设$1\le i\le r$,则: $$\left \{ \begin{array}{c} L_i=R_{i-1} \\ R_i=L_{i-1}\oplus F(R_{i-1},K_i) \end{array} \right.,F为圈函数$$ 为了可以利用同一个算法进行加密和解密,Feistel分组密码加密过程的最后一轮没有左右对换。 SP网络主要是对明文进行两项操作:由子密钥控制的替换S、置换或可逆的线性变换P。前者主要起混淆作用,后者主要起扩散作用。 设计分组密码,有以下几个要求: 分组长度$n$要足够大 密钥量要足够大(置换字集中的元素足够多),尽可能消除弱密钥 由密钥确定的置换算法要足够复杂,充分实现扩散和混淆 加解密运算简单,易于实现 数据扩展(一般没有) 差错传播尽可能小 DES DES(Data Encryption Standard)是第一个众所周知的分组密码,其分组长度为64bit,密钥长度也为64bit。于1977年1月15日被公布,现已被AES取代。 DES采用Feistel网络进行实现,一共迭代16轮,64bit密钥中包含56bit密钥和8bit奇偶校验位。下图简要介绍了其工作原理: 初始置换和逆初始置换 初始置换和逆初始置换在密码方面作用不大,其主要作用是打乱明文ASCII码字划分的关系,打乱各位的次序。 初始置换 58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 1 59 51 43 35 27 19 11 3 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7 逆初始置换 408481656246432 397471555236331 386461454226230 375451353216129 364441252206028 353431151195927 342421050185826 33141 949175725 置换的方法是,将置换表中数字对应位置的值替换原来的值。经过初始置换,明文$X$变为:...

Apr. 8, 2020 · 3 min · 509 words