MISC

MISC

Posted by mr_king on July 20, 2020

[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

BATyrj.md.png

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(分解后图片的基础名)

B3XNSP.md.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 文件名