刘功瑞的博客

有一天你突然惊醒,发现这一切,都只不过是一场梦。

BUGKU CTF 分析 Writeup 3

weblogic


题目:

黑客攻击了Weblogic应用,请分析攻击过程,找出Weblogic的主机名。flag格式:flag{}

Tip:主机名为十六进制。

来源:第七届山东省大学生网络安全技能大赛

解题:

看别人的writeup做出来的,weblogic 攻击流量审计。模拟了爆破weblogic登录密码,通过部署war包getshell,执行命令获取hostname的操作。

既然flag是主机名,我们用wireshark搜索http contains "hostname"

1.png

追踪一下http流,可以找到hostname

2.pngflag{6ad4c5a09043}



信息提取

题目:

sqlmap用过吗

解题:

也是看了别人的writeup写的,题目提示这是一道sqlmap注入过程分析题, 所以我们直接过滤出http流量. 直接 文件->导出分组解析结果->为CSV。

经过观察, 可以发现这是一次sqlmap注入过程.


导出分组解析结果为csv文件, 接下来的操作就是先将url编码转换过来, 找到注入flag的地方.  发现是从编号806的数据包开始:

"806","11.987578","10.0.0.101","10.0.0.201","HTTP","592","GET /message.php?id=1 AND ORD(MID((SELECT IFNULL(CAST(`value` AS CHAR),0x20) FROM isg.flags ORDER BY `value` LIMIT 0,1),1,1))>64 HTTP/1.1 "

"808","11.988800","10.0.0.201","10.0.0.101","HTTP","467","HTTP/1.1 200 OK (text/html)"

上面就是开始注入flag的地方, 经过分析发现注入方法是二分法.

sqlmap二分法

如果大于64成功, 那么加上64的1/2即在判断是否大于96, 依次判断下去, 最后的判断结果一定会收敛最后一个判断的数字的本身或者比它大1.

而且我们发现如果注入的结果是真, 那么返回的消息会有这一行, 消息长度应该大于460.

否则返回的响应长度小于440, 因为没有 The quick.... 这组数据.

拿编号866的数据包来分析, 如果判断的结果大于73, 那么如果下一行返回的响应信息的长度大于460(因为成功的响应会多一行), 那么这次注入的结果应该是73+1为74, 但是我们发现返回的响应长度是430, 小于440, 即为假, 那么最后的结果就应该是73, 字符 I.所以flag的第一个字符是 I.

那么接下来是写脚本得出这个flag的值. 附上我的脚本:

# -*- coding:utf-8 -*-
import re
import urllib

root_path = unicode('D:\\ctfWP\\bugku\\分析\\信息提取\\http', 'utf-8')
# 更改为自己从wireshark提取出的csv文件地址
f = open(root_path)
lines = f.readlines()
datas = []
# 转码, 保存进datas
for line in lines:
    datas.append(urllib.unquote(line))
lines = []  # 懒得改, 就复用一下, 这个lines保存注入flag的url
for i in range(len(datas)):  # 提取出注入flag的url
    if datas[i].find("isg.flags ORDER BY `value` LIMIT 0,1),1,1))>64") > 0:
        lines = datas[i:]
        break
flag = {}
# 用正则匹配
macth1 = re.compile(r"LIMIT 0,1\),(\d*?),1\)\)>(\d*?) HTTP/1.1")
macth2 = re.compile(r'"HTTP","(\d*?)","HTTP/1.1 200 OK')
for i in range(0, len(lines), 2):  # 因为有返回响应, 所以步长为2
    get1 = macth1.search(lines[i])
    if get1:
        key = int(get1.group(1))  # key保存字符的位置
        value = int(get1.group(2))  # value保存字符的ascii编码
        get2 = macth2.search(lines[i + 1])
        if get2:
            if int(get2.group(1)) > 450:
                value += 1
        flag[key] = value  # 用字典保存flag
f.close()
result = ''
for value in flag.values():
    result += chr(value)
print(result)

ISG{BLind_SQl_InJEcTi0N_DeTEcTEd}

特殊后门

题目:

从通信方式的角度看,后门可分为http/https型、irc型、dns型、icmp型等等。安全人员抓到一份可疑的流量包,请从中分析出利用某种特殊协议传输的数据。

来源:第七届山东省大学生网络安全技能大赛

解题:

使用wireshark打开,搜索icmp协议,看到第一个

1.pngflagishere,说明flag就在这个协议中,往下看,下一个包里面内容是f,再下一个是l,然后是a,然后是g,应该就是flag{***}

2.png然后我们导出这些数据,导出为json,写个脚本读取一下。

3.png脚本如下,脚本执行可能会报错,需要把刚才导出的json处理一下删除序号大于300的数据(第300个包是最后一位“}”),里面有一些乱码,windows下python会报错:

# -*- coding:utf-8 -*-
import json

root_path = unicode('D:\\ctfWP\\bugku\\分析\\特殊后门\\1', 'utf-8')
f = open(root_path)
str = f.read().decode('utf-8')
# 将字符串转为json格式
data = json.loads(str)
r = ''
for i in data:
    r += i['_source']['layers']['icmp']['data']['data.text']
print r

flag{Icmp_backdoor_can_transfer-some_infomation}

发表评论:

Powered By Z-BlogPHP 1.5.2 Zero

Copyright www.liugongrui.com.All Rights Reserved.