MISC部分

0x01:神奇的Modbus

下载附件
直接用wireshark打开
题目名称为modbus,那么我们想到了modbus协议
那么我们就直接过滤modbus协议的数据包:

然后再追踪TCP流,就可以得到flag了

0x02:侧信道攻击

下载题目附件
我们得到了下面两张图

图一:

图二:

这里是参考网上一篇文章来的,具体原理也不是太懂,原文如下:

我们只需要弄明白以下几个问题,这道题就可以得出答案了:
1.ADD的特征
2.DBL的特征
3.什么时候比特密钥为1
4.什么时候比特密钥为0


然后我们可以得到答案为:0110111010

0x03:肥宅快乐题

这道题给的附件是一个flash游戏,说得是游戏通关就可以得到flag了。但是想要通过打游戏通关估计是很困难的,所以我们的思路是直接flash逆向,然后找flag。
这里要用一个工具叫做JPEXS,是一款开源的flash逆向工具
我们直接用该工具打开附件:

直接点击左上角的happy.swf,右边就会出现游戏,我们可以直接调整游戏的帧到游戏结尾的地方

在这里我们并没有找到flag,但是得到了一串字符,说不定flag藏在脚本中呢?
我们可以通过这串字符定位到结尾处的脚本

得到两个搜索结果,我们直接点开第二个

在附近发现一串神秘字符:

很像base64,那么我们就拿去base64解码试试

得到flag


WEB部分

0x01:新的建议板

打开题目后是一个留言板
我们先注册一个账号,然后在留言板随便写一些东西

然后我们发现我们的留言会在下方显示出来
那么我们就试一下最基本的xss:
<script>alert(/xss/)
然后我们发现下面留言显示如下:

我们的输入并没有直接输出出来,而是经过了一定的改变,所以这样直接不能产生xss

如果我们在加载的时候注意它加载的文件,我们可以发现该页面加载了AngularJS

我们再来看一下菜鸟教程中AngularJS的第一个例子:

1
2
3
4
<div ng-app="">
<p>名字 : <input type="text" ng-model="name"></p>
<h1>Hello {{name}}</h1>
</div>

执行效果如下:

我们可以看到,这个的效果类似于留言板,可以推出留言板处是采用了AngularJS
而AngularJS的所有代码都是在AngularJS沙箱中运行的,但是AngularJS沙箱又是不安全的,因此只要逃逸了沙箱就可以构造xss了
要想逃逸,我们需要先知道AngularJS的版本:
1.在控制台输入 angular.version
2.或者直接在network中点击查看angular文件

我们可以看到AngularJS的版本为1.4.6
那么我们就可以去网上搜相对应的逃逸的payload

有一篇文章总结了很多版本的payload:
http://seaii-blog.com/index.php/2017/09/02/68.html
1.4.6的对应的payload如下:

1
{{ x={y:''.constructor.prototype};x.y.charAt=[].join;[1]|orderBy:'x=alert(1)' }}


但是上面的payload任然会有一些限制,比如我们alert一个document.cookie的时候,document会被过滤
我们可以使用下面这个payload

1
{{'a'.constructor.prototype.charAt=[].join;$eval('x=eval(atob("YWxlcnQoZG9jdW1lbnQuY29va2llKQ=="))');}}

我们如果只需要将要执行的js,经过base64编码后替换掉上面payload中的base64编码就好了

未完待续。。。。。

CRYPT部分

0x01:it may contain ‘flag’

打开txt文件:
内容如下:

1
2
3
4
n=0x1fb18fb44f4449f45ea938306c47b91f64b6c176bd24dbb35aa876f73859c90f0e1677d07430a1188176bc0b901ca7b01f6a99a7df3aec3dd41c3d80f0d17292e43940295b2aa0e8e5823ffcf9f5f448a289f2d3cb27366f907ee62d1aaeba490e892dc69dacbafa941ab7be809e1f882054e26add5892b1fcf4e9f1c443d93bf
e=0xe42a12145eaa816e2846200608080305c99468042450925789504307cbc54a20ed7071b68b067b703a1679d861795542f8cbd2d1cb4d3847d0940cac018cdb0fa729571afbe10c1b8be2dd8acd99ee48b77d53c435b9c2fed59e12e02ad8cfc2bcc46ad85534c266dcc1f3a1a03d87118eaf3f5b3eeeb3be84ad023a4bf34939
c=0xd19d63015bdcb0b61824237b5c67cb2ef09af0c6cd30e193ff9683357b1e45ab4df607b8c1e0b96cafc49a84d7e655c3ce0f71b1d217eec9ca6cdfa57dd3dc92533b79431aa8a7d6ca67ac9cdd65b178a5a96ab7ce7bf88440f4a9b9d10151b0c942a42fdab9ea2c2f0c3706e9777c91dcc9bbdee4b0fb7f5d3001719c1dd3d3
Tell me the msg.

题目告诉了我们n,e,c
很明显是一个rsa解密,我们只用求出m应该就可以得到flag了
直接用下面这个脚本就可以得到flag了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# -*- coding: cp936 -*-
import gmpy2
import time
def continuedFra(x, y):
cF = []
while y:
cF += [x / y]
x, y = y, x % y
return cF
def Simplify(ctnf):
numerator = 0
denominator = 1
for x in ctnf[::-1]:
numerator, denominator = denominator, x * denominator + numerator
return (numerator, denominator)
def calculateFrac(x, y):
cF = continuedFra(x, y)
cF = map(Simplify, (cF[0:i] for i in xrange(1, len(cF))))
return cF
def solve_pq(a, b, c):
par = gmpy2.isqrt(b * b - 4 * a * c)
return (-b + par) / (2 * a), (-b - par) / (2 * a)
def wienerAttack(e, n):
for (d, k) in calculateFrac(e, n):
if k == 0: continue
if (e * d - 1) % k != 0: continue
phi = (e * d - 1) / k
p, q = solve_pq(1, n - phi + 1, n)
if p * q == n:
return abs(int(p)), abs(int(q))
print 'not find!'
time.clock()
n = 0x1fb18fb44f4449f45ea938306c47b91f64b6c176bd24dbb35aa876f73859c90f0e1677d07430a1188176bc0b901ca7b01f6a99a7df3aec3dd41c3d80f0d17292e43940295b2aa0e8e5823ffcf9f5f448a289f2d3cb27366f907ee62d1aaeba490e892dc69dacbafa941ab7be809e1f882054e26add5892b1fcf4e9f1c443d93bf
e = 0xe42a12145eaa816e2846200608080305c99468042450925789504307cbc54a20ed7071b68b067b703a1679d861795542f8cbd2d1cb4d3847d0940cac018cdb0fa729571afbe10c1b8be2dd8acd99ee48b77d53c435b9c2fed59e12e02ad8cfc2bcc46ad85534c266dcc1f3a1a03d87118eaf3f5b3eeeb3be84ad023a4bf34939
c = 0xd19d63015bdcb0b61824237b5c67cb2ef09af0c6cd30e193ff9683357b1e45ab4df607b8c1e0b96cafc49a84d7e655c3ce0f71b1d217eec9ca6cdfa57dd3dc92533b79431aa8a7d6ca67ac9cdd65b178a5a96ab7ce7bf88440f4a9b9d10151b0c942a42fdab9ea2c2f0c3706e9777c91dcc9bbdee4b0fb7f5d3001719c1dd3d3
p, q = wienerAttack(e, n)
print ' p =',p
print ' q =',q
print ' n =',p*q
d = gmpy2.invert(e,(p-1)*(q-1))
print ' d =', d
print ' m is:' + '{:x}'.format(pow(c,d,n)).decode('hex')

最后更新: 2018年07月28日 12:32

原始链接: http://drac0nids.top/2018/06/20/2018-sctf-write-up/

× 请我吃糖~
打赏二维码