一个彩笔的日常...

0%

misc520

misc520
时间匆忙就做了一题还没有提交…
是一个经典的usb鼠标流量分析题了
下载题目拿到520个套娃zip,直接7z加连点器提取flag.png
然后放到Stegsolve.jar看到bgr通道里面有一个zip
misc520
提取出来发现加密拿去爆破password:12345
又拿到pacp,打开看看是一个鼠标流量就用kali的工具提取一下数据
(USB协议的数据部分在Leftover Capture Data域之中,在Mac和Linux下可以用tshark命令可以将 leftover capture data单独提取出来 命令如下:

1
tshark -r usb1.pcapng -T fields -e usb.capdata > usbdata.txt

)
misc520
发现前面有一堆空行和后面也有空行于是去掉空行:

1
cat filename | sed -e '/^$/d' > filename

然后

1
2
3
4
5
6
import re
file = open("output.txt",'w')
with open('usb.txt', 'r') as lines:
for line in lines:
result = re.sub(r"(?<=\w)(?=(?:\w\w)+$)", ":", line)
file.write(result)

变成这种形式
misc520
用大佬的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nums = []
keys = open('output.txt','r')
posx = 0
posy = 0
for line in keys:
if len(line) != 12 :
continue
x = int(line[3:5],16)
y = int(line[6:8],16)
if x > 127 :
x -= 256
if y > 127 :
y -= 256
posx += x
posy += y
btn_flag = int(line[0:2],16) # 1 for left , 2 for right , 0 for nothing
if btn_flag == 1 :
print posx , posy
keys.close()

搞出坐标画图发现是反的,改一下y轴坐标为负即

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nums = []
keys = open('output.txt','r')
posx = 0
posy = 0
for line in keys:
if len(line) != 12 :
continue
x = int(line[3:5],16)
y = int(line[6:8],16)
if x > 127 :
x -= 256
if y > 127 :
y -= 256
posx += x
posy += y
btn_flag = int(line[0:2],16) # 1 for left , 2 for right , 0 for nothing
if btn_flag == 1 :
print posx , -posy
keys.close()

拿去py2一下得出坐标然后kali下gnupolt和plot “loacl.txt”,得flag

10.13的做题小记录

1.刷新过的图片

这里下载题目得到一张图片,hex观察无果,其他的隐写也无果。考虑题目的提示:刷新的按键一般是F5。故考虑F5隐写。
F5刷新隐写,原理文献:https://wenku.baidu.com/view/c9150e29b4daa58da0114a39.html,
利用工具:https://github.com/matthewgao/F5-steganography,
使用命令:java Extract 123456.jpg -p [password]/[空],在output.txt找解密后的文本,得flag。

2.snake

下载后又是一张jpg,观察图片hex发现熟悉的504B,提取zip后得到两个文件,一个key,一个cipher,打开key,有一串base64字符,解码之后,得到:

1
What is Nicki Minaj's favorite song that refers to snakes?

百度一波得到key:anacondam,对于蛇这个名词,在英语中还有一个翻译:Serpent。
Serpent是一个加密算法,关于算法的更多详细信息参考博客,
找一个在线网站ecb模式输入key得到flag。

3.梅花香之苦寒来

下载又又是图片,emmmm,查看hex看到jpg文件尾发现大量字符串
misc
不难判断这是[^16进制],[^16进制]:一般用数字0到9和字母A到F(或af)表示,其中:AF表示10~15,这些称作十六进制数字。
一个字节一组转ascii码

1
2
3
4
5
6
7
8
9
with open('hex.txt','r') as h:
h=h.read()
j = open ('ascii.txt','w')

tem=''
for i in range(0,len(h),2):
tem='0x'+h[i]+h[i+1]
tem=int(tem,base=16)
j.write(chr(tem))

得到misc
好多好多的坐标,
使用gnuplot工具绘图,安装:
输入:apt-get install gnuplot,然后输入:gnuplot 就可以打开了
但是打开之后并不能良好的使用,会报错:Terminal type set to ‘unknown’
因此需要安装多余的依赖包,输入:apt-get install gnuplot-x11
misc
但是gnuplot识别的坐标为x y以空格作为分隔,所以用脚本让坐标变成gnuplot可以识别的坐标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
with open('ascii.txt','r')as a:
a=a.read()
p = open("output.txt",'w')
a=a.split()
tem=''
for i in range(0,len(a)):
tem=a[i]
tem=tem.lstrip('(')
tem=tem.rstrip(')')
for j in range(0,len(tem)):
if tem[j]==',':
tem=tem[:j]+' '+tem[j+1:]
p.write(tem)
p.write("\n")

最终misc
kali下在output目录下gnuplot: “plot output.txt”
misc

[BJDCTF 2nd]圣火昭昭-y1ng

下载zip又是一张图片,右键查看属性备注有一个新约佛论禅加密
misc
解密得到gemlove
在看题目提示
misc
猜测出题人使用了outguess工具隐写文件
工具下载:https://github.com/crorvick/outguess
下载源文件:git clone https://github.com/crorvick/outguess
kali下执行命令./configure && make && make install 进行编译及安装。
misc
安装成功!!!(其实我挺害怕报错的=D)
使用命令:outguess -k ‘gemlove’ -r ./sheng_huo_zhao_zhao.jpg flag.txt
misc

tips:

⚫ “++.>++++”这是brainfuck代码,使用在线执行网站运行即可得到明文

⚫ emoji 加密在线网站key为emoji,或者网站https://github.com/mozilla/codemoji下载源码

⚫ base64可以转图片

⚫ ook也是一个加密密文,在线网站

⚫ “佛曰”为与佛论禅加密,”新佛曰”为新约佛论禅

⚫ 识别outguess和steghide隐写的方法:(待验证)”password”的密匙偏向于steghide,”key”的密匙偏向于outguess,主要看题目有没有提示工具的关键名字如:”guess”,”hide”

⚫ another:

misc
隐写的还有一种JPG隐写的方法——使用jphhs05工具来载入数据
misc

end…

关于8月的ctfwp :D

2020ciscn’s wp: https://www.gem-love.com/ctf/2569.html
https://www.gksec.com/amp/CISCN2020_Online_WriteUp.html
2020gactf’s wp:https://mp.weixin.qq.com/s/7POuTp37wzY7bS3R-Fldog
misc: https://mp.weixin.qq.com/s/TXXyzswABUv4cLDOw5SdI
Crypto: https://mp.weixin.qq.com/s/c4bK2R_n_r5q_7rSidEuTg
WEB: https://mp.weixin.qq.com/s/H0-imfruCTIXtMG16a9CIA
ctf02
钓鱼城杯量子加密misc题:

《量子加密》writeup by @xmcp

本题有跑脚本的环节,下文所述的运行时间在一台i 7 - 10510U (25W) 笔记本电脑上测出。

解题过程分为三个部分: 1 ) 解密ZIP, 2 ) 分析流量, 3 ) 破解口令。

解密ZIP

首先打开压缩包,发现有密码保护,看到注释:

1
2
Password is longer than 16 bytes, and includes at least one number and one uppercase letter.
Feel free to crack it if you can, probably with your high-performance quantum computer :)

说明难以暴力破解。

压缩包里面有“capture.pcapng”和“hint_for_capture.txt”,压缩算法都是Store,这很奇怪,因
为pcapng并非十分紧密的格式,压缩软件没有理由不压缩它。

因此我们考虑ZIP明文攻击,只需要知道pcapng中至少 12 个字节(其中至少 8 个字节连
续)的内容即可破解。

上网搜索pcapng的文件头格式:

ctf02

红色部分是固定的:Block Type始终为 0 A0D0D0A;Block Total Length是小端存储的Header
长度,显然不会超过64KB,所以高两位都是 00 ;Byte-Order Magic在小端机器上始终为
4 D3C2B1A;Major Version目前只有 0100 ;Minor Version目前只有 0000 。

这样可以知道文件中的 4 + 10 字节内容,满足明文攻击的要求。

其实蓝色部分也是可以猜出来的:Section Length是可选字段,大多数软件(比如WireShark)
在保存pcapng时会写入- 1 (即 8 个字节的FF)。

因此,把蓝色部分也算上的话,我们知道文件中的4+ 18 字节内容,对明文攻击绰绰有余了。

为了严谨起见,我们只使用十分确定的红色部分进行明文攻击。

注意到AZPR不支持明文分段的ZIP明文攻击,我们使用bkcrack.

在压缩包中提取出密文capture.pcapng.enc( 888832 字节)和hint_for_capture.txt.enc( 48
字节),把已知的 10 字节明文保存为capture.pcapng.plain。运行下面的命令进行攻击:
ctf02

运行 29 分钟后得到秘钥。运行下面的命令解密文件:

ctf02

分析流量

打开pcap看到上千个HTTP流量,用Fiddler查看发现全都是对192.168.142.138:8080的请
求,User-Agent为sqlmap/1.3.5.105#dev,可以判断是sqlmap自动对服务器进行SQL注入
的过程。
ctf02

具体观察请求参数和响应,发现sqlmap在尝试盲注flags表的flag字段,请求使用了HEAD
方法(对应sqlmap的–null-connection参数),而且请求顺序是乱的(对应sqlmap的–
threads参数)。

根据前几个GET的响应可以判断出响应头Content-Length为 5 表示“error”,为 2 表示“ok”。
ctf02

例如上述请求在判断flag的第 32 位字符是否大于 0 x 65 ,返回 5 表明结果是否定的。

将所有HTTP请求导出成文本文件:
ctf02

然后编写脚本获得flag内容:
ctf02

根据hint_for_capture.txt的提示,得到的内容经过了base85编码。
ctf02
将脚本输出base 85 解码得到:

1
2
flag is md5("Sq1it3"+压缩包密码)
Hint: 密码是一个身份证号,且出生年份恰有两个质因子

破解口令

我们需要破解压缩包口令,考虑John the Ripper。首先用zip2john转换一下:
ctf02

其中hint_for_capture.txt是压缩包中的纯ASCII文件而且比较小,用来加速破解过程。

已经知道压缩包密码是合法的身份证号。由于压缩包注释提到密码包括大写字母,可以推出
身份证尾号为X。通过分解质因数得到可行的出生年份列表:
ctf02

我们分析一下身份证的格式:

⚫ 前 6 位是区号,上网搜一下可以得到区号列表,全国的合法区号不超过 4000 个。

⚫ 然后 4 位是出生年份,我们从 2020 往下枚举。

⚫ 然后 4 位是出生月日,不超过 366 个。

⚫ 然后 3 位是当天的序号,只需要枚举两位,最后一位可以利用校验码唯一确定。

⚫ 最后 1 位是校验码,固定为X。

这样一来,密码的值域降低到了 1010 量级,可以进行破解了。

首先我们在网上搞一份身份证区号列表,存为id_prefix.txt,然后用C++写一个枚举合法身
份证号的代码(编译选项-Ofast -march=native,不用Python因为太慢了)。
ctf02

上面这个代码的命令行参数是年份,将把该年的所有尾号为X的合法身份证号输出到stdout。

调用该程序生成字典,然后用john破解。脚本如下:
ctf02

运行 4 分钟后得到密码:

ctf02

计算md5(“Sq1it332070119840810108X”)即得到flag。

又到了周末,上网课是真的难受,今天就写写前几天做的题吧(由于我太菜,只做了几道misc)。

misc1

misc1
下载题目得到一个zip,解压得到一张图片。
misc1
先用010打开一下,发现尾部之后有一串base32编码。
misc1
拿去在线解码,得到这个:
misc1
发现是又是一串奇怪的字符,emmm,也可能是16进制,然后想想常用的文件的头和尾,好像也不是,然后看到了尾部的o405感觉和zip的头部504b相似。
然后拿去在线字符翻转。
misc1
思考是不是zip的文件然后经过了加密,然后就找到了rot13
misc1
拿去在线解密,复制,另存为zip文件,然后解压…
misc1
然后….加密了?
misc1
misc1
也没有密码,先看看是不是文件伪加密。
misc1
发现伪加密,然后解压得到flag。
misc1


misc2

又是一张图片
misc2
发现图片有500kb大小,里面会不会藏东西,拿去kali扫描一下,无获……
misc2
于是只好看rgb通道有没有什么收获
misc2
发现一张二维码,嘻嘻
misc2
但是扫描后又是奇怪的字符估计又是hex。
看到是pyc的头部…
然后拿去在线工具运行。
misc2
在python运行一下得到flag。


misc3

一个小滑稽
misc3
先用010打开,发现jpg尾部之后还有东西。
misc3
于是想想会不会后面藏了什么文件,继续往下看,看到了png的头89504E47
misc3
就像这样子
misc3
然后就写一个小小的py脚本:
flie = ‘a.txt’
with open(flie,’r+’) as f:
r = f.read()
list1 = r.split(‘ ‘)
with open(‘xie.txt’,’w’) as x:
yaor = ‘’
for i in range(len(list1)):
yaor = list1[-1] + ‘ ‘
list1.pop(-1)
x.write(yaor)
然后复制另存为png就完事了
misc3


misc4

emmm,是一个pcap文件,流量分析还不是还会,顺便学习好了。
misc4
过滤一下http协议
misc4
看见一个md5加密和gzcompress()函数
misc4
于是md5拿去在线网站撞库,得到cometohackme,无果…
继续看看剩下的,http追踪流发现一串字符串,感觉是base64的密文,拿去php解密
misc4
misc4
得flag


misc5

是一个图
misc5
有300kb了,再一次拿到kali扫描
misc5
再一次无果
misc5
(可恶….是幻术吗…明明感觉是这样子…怎么会再一次…大意了)
然后看看rgb通道,没有什么东西。考虑lsb隐写,然后得到zip的hex
misc5
文件损坏…拿WinRAR修复一下
misc5
得到一个未知文件,用010打开是一个elf文件,要用kali打开
misc5
misc5
misc5
sudo chmon 755 1 给一个限权
misc5

最近从xx音乐下载了一堆周杰伦的歌,发现后面有随机生成的数字,一个个重命名太慢了,只好写个py

源码:
import os
import os.path
import sys
from string import digits
etx=’.flac’
read_file_dir = input(r’请输入要修改文件扩展名的路径:’)
files = os.listdir(read_file_dir) # 列出当前目录下所有的文件
for filename in files:
portion = os.path.splitext(filename) # 分离文件名字和后缀
remove_digits = str.maketrans(‘’, ‘’, digits)
res = portion[0].translate(remove_digits) #去掉数字的前缀
newname = res + etx #重新组合
if not any(char.isdigit() for char in newname): #去掉数字后做一个保存
os.chdir(read_file_dir)
os.rename(filename,newname)
print(os.path.basename(filename)+’ -> ‘+ os.path.basename(newname))


在冲浪的时候看见的菜鸟教程的笔记,于是白嫖了:
# 搜寻单层目录下的blv文件并将其转换为flv文件
# 用于哔哩哔哩缓存视频blv格式转换后合并(本例程只是做个小小的扩展名转换)

import os
import os.path

ext_from = '.blv'
ext_to = '.flv'

read_file_dir = input(r'请输入要修改文件扩展名的路径:')

files = os.listdir(read_file_dir) # 列出当前目录下所有的文件

for filename in files:
    portion = os.path.splitext(filename) # 分离文件名字和后缀

    if portion[1] ==ext_from:  #检测扩展名
        newname = portion[0]+ext_to  #改新的新扩展名
        os.chdir(read_file_dir)  
        os.rename(filename,newname)
        print(os.path.basename(filename)+' -> '+ os.path.basename(newname))

用py写了一个简单的ip代理池,源码如下:

从xici爬取ip

tip: 需要在目录下创建HTTPS_ip.txt和HTTP_ip.txt和一个enable_ip.txt
# -- coding: utf-8 --

from bs4 import BeautifulSoup
import requests
import os

def get_ip_list(url):
    headers = {'Accept': 'text/html, application/xhtml+xml, image/jxr, */*',
            'Accept - Encoding':'gzip, deflate',
            'Accept-Language':'zh-Hans-CN, zh-Hans; q=0.5',
            'Connection':'Keep-Alive',
            'Host':'zhannei.baidu.com',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063'}
    web_data = requests.get(url=url,headers=headers)
    if '200' not in web_data:
        print("访问失败,可能是禁了ip,当前访问页面状态码:%s" % (web_data))
    soup = BeautifulSoup(web_data.text,'html.parser')
    ips = soup.find_all('tr')
    fhttp = open("HTTP_IP.txt",'a')
    fhttps = open("HTTPS_IP.txt",'a')
    fsocks = open("socks_IP.txt",'a')
    for i in range(1,len(ips)):
        ip_info = ips[i]
        tds = ip_info.find_all('td')
        print("IP:{}    port:{}    noun:{}".format(tds[1].text,tds[2].text,tds[5].text))
        item = str(tds[1].text) + ',' + str(tds[2].text) + ',' +str(tds[5].text) + '\n'
        if 'HTTP' in item and len(tds[5].text) == 4:
            fhttp.write(item)
        if 'HTTPS' in item:
            fhttps.write(item)
        if 'socks4/5' in item:
            fsocks.write(item)
    fhttp.close()
    fhttps.close()
    fsocks.close()




if __name__=="__main__":
    if (os.path.exists("HTTP_IP.txt")):  #判断文件是否存在,存在返回True,否则返回False
        os.remove("HTTP_IP.txt")  #删除存在的文件,为了追加的写入方式写入的数据不重复
    if (os.path.exists("HTTPS_IP.txt")):  
        os.remove("HTTPS_IP.txt")
    if (os.path.exists("socks_IP.txt")):  
        os.remove("socks_IP.txt")      #突然想到直接在这里就以w方式打开文件,就不需要考虑以追加的写入方式写入的数据重复的问题
    for i in range(1,11):        #设爬取代理的范围
        target_url = "https://www.xicidaili.com/nn/" + str(i) # 爬取代理的网站
        get_ip_list(target_url)

验证ip可用性
# -*- coding: utf-8 -*-

import requests
from queue import Queue
import sys
import threading
import telnetlib


class Check_IP(threading.Thread):


    def __init__(self,queue):
        threading.Thread.__init__(self)
        self._queue = queue

    def run(self):
        global lines 
        lines = [] 

        while (not self._queue.empty()):    #只要队列不为空就继续从队列中取url路径
            url = self._queue.get()
            # print(url)

            ip,port,types = url.split(',',3)

            try :
                telnetlib.Telnet(ip,port,timeout=6)        #超过6秒则判定为无效IP代理

                # if r.status_code == 200 :
                #     sys.stdout.write('[*] %s\n' % url)    #显示状态码为200的url
                print("%s可用" % (url))
                lines.append(url+'\n')
            except Exception:
                print("%s不可用" % (url))

    def write_enable_ip():
        fw = open("enable_ip\\enable_ip.txt",'w')
        for i in range(len(lines)):
            fw.write(lines[i])
        fw.close()            


def start(txt,count):
    queue = Queue()

    fr = open('%s' % txt,'r',encoding='utf-8')    #按行读取文件内容
    lines = fr.readlines()  
    fr.close()
    for line in lines:
        ip,port,types= line.split(',',3)    #将ip、端口和类型读取并分别赋值
        types = types.rstrip('\n')
        queue.put(ip+','+port+','+types) 

    threads = []
    thread_count = int(count)

    for i in range(thread_count):
        threads.append(Check_IP(queue))

    for t in threads:
        t.start()

    for t in threads:
        t.join()    

if __name__=="__main__":
    txt = 'HTTPS_IP.txt'        #设置要验证的代理类型的文件
    count = 8    #设定线程数
    start(txt,count)
    Check_IP.write_enable_ip()

我是项目地址
password:31ex