[TOC]
杂项总结
binwalk的使用
binwalk 文件名
- 1.自动分析文件所隐藏的内容;
- 2.分离文件:dd if=文件名 of=输出文件名 skip=所在位置 bs=1
- 3.一键分离:foremost 文件名 (会生成output文件夹)
strings
strings指令作用是把文件中的可打印字符串打印出来显示在控制台上
base64转图片
import base64
img = base64.b64decode(input())
fh = open("pic.jpg", "wb")
fh.write(img)
fh.close()
winhex改图片的长宽
Stegsolve查看各色道的图片
软件中的Data Extract可以选择色道进行保存
outguess算法
图片隐写的一种,linux 中:outguess -r lamb.jpg out
详细说明png文件头
先详细解释一下png的文件头:
- (固定)八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头
- (固定)四个字节00 00 00 0D(即为十进制的13)代表数据块的长度为13
- (固定)四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示(IDCH)
- (可变)13位数据块(IHDR)
- 前四个字节代表该图片的宽
- 后四个字节代表该图片的高
- 后五个字节依次为: Bit depth、ColorType、Compression method、Filter method、Interlace method
- (可变)剩余四字节为该png的CRC检验码,由从IDCH到IHDR的十七位字节进行crc计算得到。 也就是说我们可以通过爆破来得到高度和宽度
爆破图片宽度脚本
import struct
import binascii
import os
m = open("misc4.png","rb").read()
for i in range(1024):
c = m[12:16] + struct.pack('>i', i) + m[20:29]
crc = binascii.crc32(c) & 0xffffffff
if crc == 0x932f8a6b:
print(i)
xortool工具的使用
xortoor -c 20 文件名
git仓库的使用
1.git log (查看git记录) 2.git stash list (查看修改列表) 3.git stash show (检验一下列表中储存的文件) 4.git stash apply (重新储存,将上面文件还原)
tcpxtract 获取流量包中文件
解决中文乱码
Linux系统的 shadow 文件格式
特征:就是Linux的shadow文件格式
工具:Kali Linux 中的 John
e.g.root:$6$HRMJoyGA$26FIgg6CU0bGUOfqFB0Qo9AE2LRZxG8N3H.3BK8t49wGlYbkFbxVFtGOZqVIq3q Q6k0oetDbn2aVzdhuVQ6US.:17770:0:99999:7::: Linux的 /etc/shadow 文件存储了该系统下所有用户口令相关信息,只有 root 权限可以查看,用户口令是以 Hash + Salt 的形式保护的。 每个字段都用 “$” 或“:”符号分割; 第一个字段是用户名,如root ; 第二个字段是哈希算法,比如 6 代表SHA-512,1 代表 MD5; 第三个字段是盐,比如上面的 HRMJoyGA 第四个字段是口令+盐加密后的哈希值 后面分别是密码最后一次修改日期、密码的两次修改间隔时间(和第三个字段相比)、密码的有效期(和第三个字段相比)、密码修改到期前的警告天数(和第五个字段相比)、密码过期后的宽限天数(和第五个字段相比)、账号失效时间,这里不太重要要;
直接跑 John 试试
john shadow
如果解开了,加 –show 查看解密口令
john –show shadow
切换www-data用户
su - www-data -s /bin/bash
仿射加密
y = 17*x-8 flag{szzyfimhyzd}
解码
def affine(a, b):
pwd = {}
for i in range(26):
pwd_dic[chr(((a*i+b)%26+97))]= chr(i+97)
return pwd_dic
if_name_'_main__':
pwd_dic = {}
pwd = 'szzyfimhyzd'
plain = []
pwd_dic = affine(17,-8)
for i in pwd:
plain.append(pwd_dic[i])
print "Flag is : i + "".join(plain)
AES加密
U2FsdGVkX19QwGkcgD0fTjZxgijRzQOGbCWALh4sRDec2w6xsY/ux53Vuj/AMZBDJ87qyZL5kAf1fmAH4Oe13Iu435bfRBuZgHpnRjTBn5+xsDHONiR3t0+Oa8yG/tOKJMNUauedvMyN4v4QKiFunw==
#看着像base64的,但不是base64
#需要密码才能解
pyc文件反编译
kali中(已经安装,自己手动安装)
uncompyle6 文件名.pyc
pyc头:03F30D0A
文件头直接为文件名字
linux 下的压缩包
用 7z打开
音频频谱图
用Audacity打开文件, 点左上角的按钮, 选择频谱图, 看到flag
GPS点信号
gpx
bmp文件隐写
bmp文件,直接linux下用zsteg查找隐写数据
zsteg 文件
图片隐写信息快速检测工具——zsteg
安装
Ubuntu中可以使用apt-get命令行工具来安装Ruby和RubyGems,如下所示:
sudo apt-get install ruby-full rubygems
Kali Linux 中则自带了RubyGems。
然后用以下命令安装zsteg后即可使用:
$ gem install zsteg
对于目标图片,可以分别输入以下命令尝试:
$ zsteg 你瞅啥.bmp --bits 1 --channel r --lsb --order xy --limit 2048
$ zsteg 你瞅啥.bmp --bits 1 --channel g --lsb --order xy --limit 2048
$ zsteg 你瞅啥.bmp --bits 1 --channel b --lsb --order xy --limit 2048
各选项含义如下,还有更多选项可以通过-h
选项查看
--bits 1
:每次只摘取颜色通道中的第 1 个比特。--channel r
:只摘取红色通道的比特位。--lsb
:按最低有效位优先的顺序进行摘取。--order xy
:按照从左至右、从上至下的顺序对图像素点进行摘取。--limit 2048
:最多摘取输出 2048 字节。
--all
懒人专属
动态图分离与合并图片
1.gif动态图分离工具(网安工具包)
2.kali convert glance.gif(源文件名) flag.png(分解后图片的基础名)
montage,这个工具用法很多,也很强大
用命令:montage flag*.png -tile x1 -geometry +0+0 flag.png
-tile是拼接时每行和每列的图片数,这里用x1,就是只一行
-geometry是首选每个图和边框尺寸,我们边框为0,图照原始尺寸即可
合成照片
openssl用法
首先介绍下命令台下openssl工具的简单使用:
生成一个密钥:
openssl genrsa -out test.key 1024
这里-out指定生成文件的。需要注意的是这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的1024是生成密钥的长度。
openssl可以将这个文件中的公钥提取出来:
openssl rsa -in test.key -pubout -out test_pub.key
-in指定输入文件,-out指定提取生成公钥的文件名。至此,我们手上就有了一个公钥,一个私钥(包含公钥)。现在可以将用公钥来加密文件了。
我在目录中创建一个hello的文本文件,然后利用此前生成的公钥加密文件:
openssl rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en
-in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。
解密文件:
openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de
-in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。
CRC校验(图片和文件两种)
一、图片
是否更改了png图片的高,可以用linux打开,linux打开显示问题,说明未过crc校验,windows会忽略crc校验。
先详细解释一下png的文件头:
- (固定)八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头
- (固定)四个字节00 00 00 0D(即为十进制的13)代表数据块的长度为13
- (固定)四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示(IDCH)
- (可变)13位数据块(IHDR)
- 前四个字节代表该图片的宽
- 后四个字节代表该图片的高
- 后五个字节依次为:
Bit depth、ColorType、Compression method、Filter method、Interlace method
- (可变)剩余四字节为该png的CRC检验码,由从IDCH到IHDR的十七位字节进行crc计算得到。
也就是说我们可以通过爆破来得到高度和宽度
方法1
通过tweakpng(网安工具包里有)改图片的高度和宽度。改出有用信息
方法2
脚本1:
# -*- coding: utf-8 -*-
import binascii
import struct
import sys
#\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xA4\x08\x06\x00\x00\x00
#\x49\x48\x44\x52\x00\x00\x05\x7C\x00\x00\x03\x0E\x08\x06\x00\x00\x00
#'\x49\x48\x44\x52'+'\x00\x00\x0F\xFF'+'\x00\x00\x05\x1D'+'\x08\x02\x00\x00\x00'
#crc32key=0x2B26F675
#crc32key = 0xCBD6DF8A
crc32key = 0x2B26F675
'''
for i in range(0, 65535):
height = struct.pack('>i', i)
#CRC: CBD6DF8A
#data = '\x49\x48\x44\x52\x00\x00\x01\xF4' + height + '\x08\x06\x00\x00\x00'
data = '\x49\x48\x44\x52'+'\x00\x00\x0F\xFF'+height+'\x08\x02\x00\x00\x00'
crc32result = binascii.crc32(data) & 0xffffffff
if crc32result == crc32key:
print ''.join(map(lambda c: "%02X" % ord(c), height))
'''
for i in range(0,65535):
for j in range(0,65535):
height = struct.pack('>i', i)
wide = struct.pack('>i',j)
data = '\x49\x48\x44\x52'+wide+height+'\x08\x02\x00\x00\x00'
crc32result = binascii.crc32(data) & 0xffffffff
if crc32result == crc32key:
print ''.join(map(lambda c: "%02X" % ord(c), height))
print ''.join(map(lambda c: "%02X" % ord(c), wide))
sys.exit()
脚本2(自主读文件)
import os
import binascii
import struct
import sys
filename = sys.argv[1]
img = open(filename, "rb").read()
for w in range(65535):
for h in range(65535):
data = img[0xc:0x10] + \
struct.pack('>i', w) + struct.pack('>i', h) + img[0x18:0x1d]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == struct.unpack('>i', img[0x1d:0x21])[0] & 0xffffffff:
print(w, h)
print(hex(w), hex(h))
open("vegetable_new.png", "wb").write(
img[:0xc] + data + img[0x1d:])
exit()
方法2
脚本跑crc校验,文本压缩包,如果每个文本的压缩文件的文本的字节数较小,可以直接用脚本进行crc校验包出文本内容,而不需要获取密码。
脚本:
# -*- coding: UTF-8 -*-
#由于使用了random 效率较低
from zlib import crc32
import random
import string
#strTable='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_{}'
strTable = string.printable
flag = ''
def crc32_f(data):
return (crc32(data)&0xffffffff)
length=input('The string length:')
#crc32_=raw_input('The string Crc32:').lower()
crc32List = [0x40e61be5,0x91c7b4a0,0xf4fd5e1c,0x02658101,0x92d786fd,0x03b3ea6a]
for crc32_ in crc32List:
while True:
text=''
for i in range(length):
text+=strTable[random.randint(0,len(strTable)-1)]
if crc32_f(text)==crc32_:
print '[+] ' + text
flag += text
break
print flag
base64隐写
脚本
#!/usr/bin/env python
import re
path = './encodeFile.txt'
b64char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open(path, 'r')as f:
cipher = [i.strip() for i in f.readlines()]
plaintext = ''
for i in cipher:
if i[-2] == '=': # There are 4-bit hidden info while end with two '='
bin_message = bin(b64char.index(i[-3]))[2:].zfill(4)
plaintext += bin_message[-4:]
elif i[-1] == '=': # There are 2-bit hidden info while end with one '='
bin_message = bin(b64char.index(i[-2]))[2:].zfill(2)
plaintext += bin_message[-2:]
plaintext = re.findall('.{8}', plaintext) # 8bits/group
plaintext = ''.join([chr(int(i,2)) for i in plaintext])
print(plaintext)
snow隐写
一般隐藏在html中
#需要passwd
snow -C -p "syclover2016" snow.html
内存取证
volatility 使用:
**volatility -f <文件名> --profile=<配置文件> <插件> [插件参数]**获取**--profile**的参数插件>配置文件>文件名>
1.使用imageinfo插件来猜测dump文件的profile值:WinXPSP2x86
volatility -f mem.vmem imageinfo
python vol.py -f ../passwd/WIN-BU6IJ7FI9RU-20190927-152050.raw imageinfo
volatility -f mem.vmem –profile=WinXPSP2x86
2.列举进程:pslist
python vol.py -f ../passwd/WIN-BU6IJ7FI9RU-20190927-152050.raw --profile=Win7SP1x86_23418 pslist
3.列举缓存在内存的注册表 :hivelist
ython vol.py -f ../passwd/WIN-BU6IJ7FI9RU-20190927-152050.raw --profile=Win7SP1x86_23418 hivelist
4.打印出注册表中的数据 :hivedump
volatility -f mem.vmem –profile=WinXPSP2x86 hivedump -o 注册表的 virtual 地址
python vol.py -f ../passwd/WIN-BU6IJ7FI9RU-20190927-152050.raw --profile=Win7SP1x86_23418 hivedump -o 0x8f97c008
5.获取SAM表中的用户 :
volatility -f mem.vmem –profile=WinXPSP2x86 printkey -K “SAM\Domains\Account\Users\Names”
python vol.py -f ../passwd/WIN-BU6IJ7FI9RU-20190927-152050.raw --profile=Win7SP1x86_23418 printkey -K "SAM\Domains\Account\Users\Names"
6.获取最后登录系统的账户 :
volatility -f mem.vmem –profile=WinXPSP2x86 printkey -K “SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon”
7.获取密码hash hashdump
python vol.py -f ../passwd/WIN-BU6IJ7FI9RU-20190927-152050.raw --profile=Win7SP1x86_23418 hashdump
键盘流量分析
tshark.exe -r b.pcap -T fields -e usb.capdata >b.txt
#//这里b.pcap是我抓捕的数据包名字,b.txt是把提取的数据输入到b.txt中
#键盘流量
# coding:utf-8
import sys
import os
usb_codes = {
0x04: "aA", 0x05: "bB", 0x06: "cC", 0x07: "dD", 0x08: "eE", 0x09: "fF",
0x0A: "gG", 0x0B: "hH", 0x0C: "iI", 0x0D: "jJ", 0x0E: "kK", 0x0F: "lL",
0x10: "mM", 0x11: "nN", 0x12: "oO", 0x13: "pP", 0x14: "qQ", 0x15: "rR",
0x16: "sS", 0x17: "tT", 0x18: "uU", 0x19: "vV", 0x1A: "wW", 0x1B: "xX",
0x1C: "yY", 0x1D: "zZ", 0x1E: "1!", 0x1F: "2@", 0x20: "3#", 0x21: "4$",
0x22: "5%", 0x23: "6^", 0x24: "7&", 0x25: "8*", 0x26: "9(", 0x27: "0)",
0x2C: " ", 0x2D: "-_", 0x2E: "=+", 0x2F: "[{", 0x30: "]}", 0x32: "#~",
0x33: ";:", 0x34: "'\"", 0x36: ",<", 0x37: ".>", 0x4f: ">", 0x50: "<"
}
def code2chr(filepath):
lines = []
pos = 0
for x in open(filepath, "r").readlines():
code = int(x[6:8], 16) # 即第三个字节
if code == 0:
continue
# newline or down arrow - move down
if code == 0x51 or code == 0x28:
pos += 1
continue
# up arrow - move up
if code == 0x52:
pos -= 1
continue
# select the character based on the Shift key
while len(lines) <= pos:
lines.append("")
if code in range(4, 81):
if int(x[0:2], 16) == 2:
lines[pos] += usb_codes[code][1]
else:
lines[pos] += usb_codes[code][0]
for x in lines:
print(x)
if __name__ == "__main__":
code2chr('E://CTF练习/杂项/18e4c103d4de4f07b33a42cb1f0eaa1d/00000122/usbdata.txt')
#python 脚本名 流量包名
#!/usr/bin/env python
import sys
import os
DataFileName = "usb.dat"
presses = []
normalKeys = {"04":"a", "05":"b", "06":"c", "07":"d", "08":"e", "09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j", "0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o", "13":"p", "14":"q", "15":"r", "16":"s", "17":"t", "18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y", "1d":"z","1e":"1", "1f":"2", "20":"3", "21":"4", "22":"5", "23":"6","24":"7","25":"8","26":"9","27":"0","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"-","2e":"=","2f":"[","30":"]","31":"\\","32":"<NON>","33":";","34":"'","35":"<GA>","36":",","37":".","38":"/","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}
shiftKeys = {"04":"A", "05":"B", "06":"C", "07":"D", "08":"E", "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J", "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O", "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T", "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y", "1d":"Z","1e":"!", "1f":"@", "20":"#", "21":"$", "22":"%", "23":"^","24":"&","25":"*","26":"(","27":")","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"_","2e":"+","2f":"{","30":"}","31":"|","32":"<NON>","33":"\"","34":":","35":"<GA>","36":"<","37":">","38":"?","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}
def main():
# check argv
if len(sys.argv) != 2:
print "Usage : "
print " python UsbKeyboardHacker.py data.pcap"
print "Tips : "
print " To use this python script , you must install the tshark first."
print " You can use `sudo apt-get install tshark` to install it"
print "Author : "
print " Angel_Kitty <angelkitty6698@gmail.com>"
print " If you have any questions , please contact me by email."
print " Thank you for using."
exit(1)
# get argv
pcapFilePath = sys.argv[1]
# get data of pcap
os.system("tshark -r %s -T fields -e usb.capdata > %s" % (pcapFilePath, DataFileName))
# read data
with open(DataFileName, "r") as f:
for line in f:
presses.append(line[0:-1])
# handle
result = ""
for press in presses:
Bytes = press.split(":")
if Bytes[0] == "00":
if Bytes[2] != "00":
result += normalKeys[Bytes[2]]
elif Bytes[0] == "20": # shift key is pressed.
if Bytes[2] != "00":
result += shiftKeys[Bytes[2]]
else:
print "[-] Unknow Key : %s" % (Bytes[0])
print "[+] Found : %s" % (result)
# clean the temp data
os.system("rm ./%s" % (DataFileName))
if __name__ == "__main__":
main()
steghide
隐藏文件 steghide embed -cf [图片文件载体] -ef [待隐藏文件] steghide embed -cf 1.jpg -ef 1.txt
查看图片中嵌入的文件信息 steghide info 1.jpg
提取图片中隐藏的文件 steghide extract -sf 1.jpg
exiftool查看图片信息
exiftool 文件名