合天实验室-职业院校技能竞赛信息安全管理与评估赛前训练

抓包工具

HTTP协议基础

1.HTTP 教程:http://www.runoob.com/http/http-tutorial.html

2.HTTP协议详解:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

3.99% 的人都理解错了 HTTP 中 GET 与 POST 的区别:https://juejin.im/entry/57597bd45bbb500053c88b4c

4.推荐书籍:HTTP权威指南


Wireshark数据抓包分析之HTTP协议

介绍了利用wireshark进行数据抓包并分析HTTP协议,通过本实验的学习,你能够熟悉并掌握Wireshark的基本操作,加深对常用网络协议的理解。

注:

wireshark命令

ip.addr == 10.1.1.33

http.request.method == POST | GET

http头注入

小试牛刀利用sql注入拿到flag,牵扯的工具BP,Sqlmap...

注:

--level 等于或者大于3的时候,就会测试Referer了。。。


CTF-WEB小技俩

<a href="xxx.php"></a>
<script><windows.location="xxx.php"/script>

HTTP的漏洞分析及基于JS的加密实现

常见解压、压缩命令

tar

解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName

(注:tar是打包,不是压缩!)


首先在Kali上打开路由功能,使得其能够接收和转发数据包。相应的指令为echo 1 > /proc/sys/net/ipv4/ip_forward。指令输入完成后回车即开启了路由功能,如图所示:

image

接下来进行ARP欺骗,ARP欺骗的指令格式非常简单,指令格式如下:

arpspoof -i 局域网网口 -t IP地址1 IP地址2

这条指令的意思是欺骗IP地址1,Kali的MAC地址即为IP地址2的MAC地址。实际操作结果如图所示:

WebGoat之HTTP基础和HTTP拆分攻击

通过该实验了解学习用Node.js构建HTTP服务器,学会使用kali进行ARP欺骗,学会用Wireshark抓数据包,利用JavaScript实现HTTP的加密传输。

操作理解,遇到错误排除

如:

1/抓包拦截不到

2/没有成功达到效果

HTTPS证书伪造

1.了解https、SSL、数字证书和加密认证的过程,比如“SSL的加密过程”

2.数字证书:是一种网络上证明持有者身份的文件,同时还包含有公钥。证书的真伪需要一个验证方式,而验证方需要认同这种验证方式,以完成证书的颁发过程。一个https的站点需要和一个证书绑定,客户端通过维护一个“根受信任机构列表”完成站点的可信识别过程,而客户端是否信任这个站点的证书取决于客户端程序是否导入了证书颁发者的根证书。

3.本实验的证书生成过程基于openssl,它是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。我们应用它构造密钥并进行X.509证书伪造。

4.X.509证书是一种通用的证书格式,符合ITU-T X.509国际标准,它主要包含三个文件:key,csr,crt。

key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密;

csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名;

crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息。

5.了解linux中Apache2服务的相关知识,对其配置文件:/etc/apache2/sites-available/default-ssl.conf有基础的了解;了解linux下提供dns服务器的bind9服务相关配置。

Burpsuite简介

1、 Burpsuite初学者教程:https://www.cnblogs.com/intoxication/p/10853834.html

2、 Burpsuite神器常用功能使用方法总结:https://zhuanlan.zhihu.com/p/22288110

3、 burpsuite相关实验:burpsuite实战:http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182014112610353900001

4、 推荐书籍:《burpsuite实战指南》:https://www.jb51.net/books/524014.html


Burpsuite简介及MIME上传绕过实例

Content-Type后的text/plain修改为image/jpeg

类型 描述 典型示例
text 表明文件是普通文本,理论上是人类可读 text/plain, text/html, text/css, text/javascript
image 表明是某种图像。不包括视频,但是动态图(比如动态 gif)也使用 image 类型 image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon, image/vnd.microsoft.icon
audio 表明是某种音频文件 audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
video 表明是某种视频文件 video/webm, video/ogg
application 表明是某种二进制数据 application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf

wireshark进行网络监听

网络监听是一种监视网络状态、数据流程以及网络上信息传输的管理工具,它可以将网络界面设定成监听模式,并且可以截获网络上所传输的信息。

wireshark数据包分析

实例分析TCP三次握手过程

TCP的三次握手过程如下图所示:

image

打开Wireshark,选中使用的网卡,开始抓取数据包。

打开IE,网页输入http://tools.hetianlab.com

在wireshark中输入http过滤, 然后选中GET / HTTP/1.1的那条记录,右键然后点击"Follow TCP Stream",

这样做的目的是为了得到与浏览器打开网站相关的数据包,点击close,将得到如下图:

图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。

第一次握手数据包

客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图:

image

第二次握手的数据包

服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图:

image

第三次握手的数据包

客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:img

就这样通过了TCP三次握手,建立了连接。


wireshark之文件还原

本实验主要介绍了wireshark文件还原技术,通过本实验的学习,你能够了解wireshark的使用方法,能够通过分析还原网络数据发送现场,并将发送的信息通过wireshark和winhex还原成原文件。

隐写术

CTF-Stegano练习之隐写1

TrID

TrID是一款根据文件二进制数据特征进行判断的文件类型识别工具。虽然也有类似的文件类型识别工具,但是大多数都是使用硬编码的识别规则,而TrID则没有固定的匹配规则,TrID具有灵活的可扩展性,可以通过训练来进行文件类型的快速识别。

TrID通过附加的文件类型指纹数据库来进行匹配,可用于取证分析、未知文件识别等用途。

Audacity

Audacity是一款自由且免费的音频编辑器和录音器。它是在Linux下发展起来的,有着傻瓜式的操作界面和专业的音频处理效果。使用Audacity可以帮助我们快速解决CTF中一些音频相关的题目。

摩斯码

摩尔斯电码(Morse Code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。是由美国人萨缪尔·摩尔斯在1836年发明。

摩斯码使用点(.)和横线(-)来表示各种字符,我们只需要知道某一串字符是摩斯码,然后使用解码工具进行解码即可。

CTF-Stegano练习之隐写2

频谱图分析

使用Audacity打开sound1.wav文件,播放声音时发现发出的声音是没有任何意义的,就像是发出了一些噪音一样,因此必须从其他方面下手分析。Audacity提供的强大的音频分析功能,包括波形图、频谱图等各种图形可视化效果,Audacity默认显示的是音频文件左右两个声道的波形图,我们可以尝试切换到频谱图进行分析.

声音反向播放

使用Audacity打开sound2.wav文件,仔细听其中发出的声音,发现前面半段音频发出的声音很难挺清楚在说什么,而后面半段则可以清晰的听到一段英文发音(实验时可能无法通过远程桌面听到实验机器发出的声音,因此这里提供原始题目文件的下载,地址为https://pan.baidu.com/s/1i_FQ1XuLp32bw8VBaktBTg 提取码:ix89,大家可以下载下来在本地测试)。

对于这种情况,我们可以猜想音频可能被反向了,我们尝试对其进行反向处理,看看能否听到有用的信息。

波形图分析

使用Audacity打开sound3.wav文件,发现左右两个声道的波形图完全不一样,其中第一个波形图只在时间轴的中间部分存在一些有规律的小点,而第二个波形图则是正常的声音波形图,最后猜测为摩斯密码!

CTF-Stegano练习之隐写3

考察选手的文件隐写取证分析能力,包括对工具TrID、BinWalk、StegHide等的了解。

分析文件类型

内嵌文件数据分析

提取隐写数据

CTF-Stegano练习之隐写4

一、BinWalk

BinWalk是一个固件的分析工具,旨在协助研究人员对固件进行分析,提取及逆向工程用处。简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,还重要一点的是可以轻松地扩展。最简单的使用方法很直接,提供文件路径和文件名即可。

二、MP3Stego

MP3Stego可以把任何敏感数据压缩隐藏到MP3音乐文件中,数据首先被进行压缩和加密处理,然后将其隐藏到MP3音乐流数据中。

CTF-Stegano练习之隐写5

一、TrID

TrID是一款根据文件二进制数据特征进行判断的文件类型识别工具。虽然也有类似的文件类型识别工具,但是大多数都是使用硬编码的识别规则,而TrID则没有固定的匹配规则,TrID具有灵活的可扩展性,可以通过训练来进行文件类型的快速识别。

TrID通过附加的文件类型指纹数据库来进行匹配,可用于取证分析、未知文件识别等用途。

二、WireShark

Wireshark是一个网络数据包分析软件,即通常所说的抓包软件。Wireshark可以抓取通过制定网卡的所有网络数据包,并根据数据包的格式尽可能显示出最为详细的信息,其支持各种主流的网络通信协议。Wireshark使用WinPCAP作为接口,直接与网卡进行数据交换。

三、FTP协议

FTP协议用于不同主机之间的文件传输,其中有一点值得注意的是:FTP 使用TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。控制连接使用类似TELNET协议在主机间交换命令和消息,文件传输协议是TCP/IP网络上两台计算机传送文件的协议。

CTF-Stegano练习之隐写6

StegSolve

StegSolve是一款基于Java开发的流行图片隐写分析软件,其支持常见的图片文件格式,可以对不同的文件进行结合(包括XOR、ADD、SUB等操作),可以对图片文件格式进行分析,可以提取GIF文件中的帧等,覆盖了基本的图片隐写分析需求。

Python Imaging Library

Python Imaging Library(简称PIL)为Python解释器提供了图像处理的功能,PIL提供了广泛的文件格式支持、高效的内部表示以及相当强大的图像处理功能。PIL图像处理库的核心被设计成为能够快速访问以几种基本像素类型表示的图像数据,它为通用图像处理工具提供了一个坚实基础。

结合PIL可以方便的编写Python脚本处理图片隐写问题。

combineImage.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

from PIL import Image

'''加载图片'''
def loadImage(filename):
    img = Image.open(filename)
    #返回两个值分别为 Width Height
    width, height = img.size

    img = img.convert("RGB")

    pixel = img.load()

    return width, height, pixel

'''功能模块'''
def combineImage(file1, file2, file3):
    w1, h1, p1 = loadImage(file1)
    w2, h2, p2 = loadImage(file2)
    # 拿到最小值 H W
    width = min(w1, w2)

    height = min(h1, h2)

    img = Image.new("RGB", (width, height))

    pix = img.load()

    for y in range(0, height):

        for x in range(0, width):
            # RGB
            r1, g1, b1 = p1[x, y]

            r2, g2, b2 = p2[x, y]

            pix[x, y] = r1 ^ r2, g1 ^ g2, b1 ^ b2

    img.save(file3)


if __name__ == "__main__":
    combineImage("flag.jpg", "flag2.jpg", "flag3.jpg")

XorAndNotImage.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-
from PIL import Image

def xorFun(x, y):

      return x^y

def orFun(x, y):

      return x|y

def andFun(x, y):

      return x&y

def loadImage(filename):

      img = Image.open(filename)

      width, height = img.size

      img = img.convert("RGB")

      pixel = img.load()

      return width, height, pixel

def combineImage(file1, file2, file3, func):

      w1, h1, p1 = loadImage(file1)

      w2, h2, p2 = loadImage(file2)

      width = min(w1, w2)

      height = min(h1, h2)

      img = Image.new("RGB", (width, height))

      pix = img.load()

      for y in range(0, height):

          for x in range(0, width):
              # RGB
              r1, g1, b1 = p1[x, y]

              r2, g2, b2 = p2[x, y]

      pix[x, y] = func(r1,r2), func(g1,g2), func(b1,b2)
      img.save(file3)

if __name__ == "__main__":
       combineImage("flag.jpg", "flag2.jpg", "xor.jpg", xorFun)
       combineImage("flag.jpg", "flag2.jpg", "or.jpg", orFun)
       combineImage("flag.jpg", "flag2.jpg", "and.jpg", andFun)

CTF-Stegano练习之隐写7

StegSolve

StegSolve是一款基于Java开发的流行图片隐写分析软件,其支持常见的图片文件格式,可以对不同的文件进行结合(包括XOR、ADD、SUB等操作),可以对图片文件格式进行分析,可以提取GIF文件中的帧等,覆盖了基本的图片隐写分析需求。

StegDetect

Stegdetect通过统计测试来分析图像文件中是否包含隐藏内容,它运行静态测试以判断隐藏的内容是否存在。此外,它还会尝试识别隐藏内容是通过哪个隐写工具嵌入的。

如果检测结果显示该文件可能包含隐藏信息,那么Stegdetect会在检测结果后面使用1~3颗星来标识隐藏信息存在的可能性大小,3颗星表示隐藏信息存在的可能性最大。

InvisibleSecrets

Invisible Secrets是一套简单易用的文件加密软件,可以使用它为重要文件或是整个文件夹进行加密。该软件可以在 JPG 文件里面附带加密文本信息。

python脚本

from PIL import Image


def loadImage(filename):
    img = Image.open(filename)

    width, height = img.size

    img = img.convert("RGB")

    pixel = img.load()

    return width, height, pixel


def ChangeColorIamge(file1, file2):
    w1, h1, p1 = loadImage(file1)


    width = w1
    height = h1

    img = Image.new("RGB", (width, height))

    pix = img.load()

    for y in range(0, height):
        for x in range(0, width):
            if p1[x, y] == (254, 254, 254):
                pix[x, y] =0, 0, 0
            else:
                pix[x, y] = 255, 255, 255
    img.save(file2)
if __name__ == "__main__":
    ChangeColorIamge("password.png", "reslut.png")

CTF-Stegano练习之隐写8

断点
image

from PIL import Image


def loadImage(filename):
    img = Image.open(filename)

    width, height = img.size

    img = img.convert("RGB")
    pixel = img.load()

    return width, height, pixel


def getFlag(filename):

    w, h, pix = loadImage(filename)

    top, left, right, bottom = h, w, 0, 0
    for y in range(0, h):
        for x in range(0, w):
            if pix[x, y] == (225, 0, 0):
                top = min(top, y)
                bottom = max(bottom, y)
                left = min(left, x)
                right = max(right, x)
    res = []
    for y in range(top + 1, bottom):
        for x in range(left + 1, right):
            if pix[x, y] == (236, 1, 2):
                res.append('1')
            else:
                res.append('0')
    res = "".join(res)
    flag = []
    for i in range(0, len(res), 8):
        t1 = res[i:i+8]
        t = int(t1, 2)
        flag.append(chr(t))
    return "".join(flag)

if __name__ == "__main__":
    flag = getFlag("steg.bmp")
    print(flag)

image

二值化

image

def loadImage(filename,file2):
    img = Image.open(filename)
    imgL = img.convert("L")
    threshold = 235
    imgL = img.point(lambda p:p > threshold and 255)
    imgL.show()


if __name__ == "__main__":
    loadImage("steg.bmp","t1.bmp")

CTF-Stegano练习之隐写9

TrID

TrID是一款根据文件二进制数据特征进行判断的文件类型识别工具。虽然也有类似的文件类型识别工具,但是大多数都是使用硬编码的识别规则,而TrID则没有固定的匹配规则,TrID具有灵活的可扩展性,可以通过训练来进行文件类型的快速识别。

TrID通过附加的文件类型指纹数据库来进行匹配,可用于取证分析、未知文件识别等用途。

WireShark

Wireshark是一个网络数据包分析软件,即通常所说的抓包软件。Wireshark可以抓取通过制定网卡的所有网络数据包,并根据数据包的格式尽可能显示出最为详细的信息,其支持各种主流的网络通信协议。Wireshark使用WinPCAP作为接口,直接与网卡进行数据交换。

SSL协议

SSL(Secure Socket Layer)安全套接层是Netscape公司率先采用的网络安全协议。它是在传输通信协议(TCP/IP)上实现的一种安全协议,采用公开密钥技术。SSL广泛支持各种类型的网络,同时提供三种基本的安全服务,它们都使用公开密钥技术。

SSL协议交互过程中,服务器返回的ServerHello消息中会包含有SessionID。客户端(浏览器端)通过一个名为ssl_session_st的结构体存储SSL相关的密钥参数,其中ssl_session_st的部分数据结构表示如下:
image

key.txt 格式

RSA Session-ID:<64 hex characters of Session ID> Master-Key:<96 hex characters of Master Key>

CTF-Stegano练习之隐写10

from PIL import Image

def chckBits(p,x,y):
    step = [(0, 1), (0, -1), (1, 0), (-1, 0)]
    bigger = 0
    smaller = 0
    for(sx, sy) in step:
        if p[x, y][0] > p[x+sx, y+sy][0]:
            bigger += 1
        elif p[x, y][0] < p[x+sx, y+sy][0]:
            smaller += 1

    if bigger == 4 or smaller == 4:
        return True

    return False


def showText(filename):
    bmp = Image.open(filename)
    pix = bmp.load()
    tmp = []

    width, height = bmp.size

    for y in range(0, height):
        for x in range(0, width):
            try:
                if chckBits(pix, x, y):
                    tmp.append((x, y))
            except:
                pass

    for (x, y) in tmp:
        pix[x, y] = (255, 255, 0)

    bmp.show()





if __name__ == "__main__":
    showText("ifs.bmp")

Python实现LSB隐写算法

Encode.py

# -*- coding: UTF-8 -*-
from PIL import Image


# Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。
def plus(str):
    return str.zfill(8)


# 获取要隐藏的文件内容
def get_key(strr):
    tmp = strr

    with open(tmp, "rb") as f:
        s = f.read()
        result = ""
        for byte in s:
            # 逐个字节将要隐藏的文件内容转换为二进制,并拼接起来
            # 1. 先用int()函数将byte转换为整数
            # 2. 使用bin()函数将十进制的整数转换为二进制
            # 3. 由于bin()函数转换二进制后,二进制字符串的前面会有"0b"来表示这个字符串是二进制形式,所以用replace()替换为空
            # 4. 又由于整数转换二进制后是不包括前导零的,所以使用自定义函数plus将其填充为8位
            t=bin(byte)
            #二进制字符串的前面会有"0b"来表示这个字符串是二进制形式
            result += plus(bin(byte)[2:])
        return result


def mod(x, y):
    return x % y


# str1为载体图片路径,str2为隐写文件,str3为加密图片保存的路径
def func(str1, str2, str3):
    im = Image.open(str1)

    # 获取图片的宽和高
    width = im.size[0]
    print("width:" + str(width) + "\n")

    height = im.size[1]

    print("height:" + str(height) + "\n")

    count = 0

    # 获取需要隐藏的信息

    key = get_key(str2)

    keylen = len(key)

    for h in range(0, height):

        for w in range(0, width):

            pixel = im.getpixel((w, h))

            a = pixel[0]

            b = pixel[1]

            c = pixel[2]

            if count == keylen:
                break

            # 下面的操作是将信息隐藏进去
            # 分别将每个像素点的RGB值余2,这样可以去掉最低位的值
            # 再从需要隐藏的信息中取出一位,转换为整型
            # 两值相加,就把信息隐藏起来了

            a = a - mod(a, 2) + int(key[count])
            count += 1

            if count == keylen:
                im.putpixel((w, h), (a, b, c))
                break

            b = b - mod(b, 2) + int(key[count])
            count += 1

            if count == keylen:
                im.putpixel((w, h), (a, b, c))
                break

            c = c - mod(c, 2) + int(key[count])
            count += 1

            if count == keylen:
                im.putpixel((w, h), (a, b, c))
                break

            if count % 3 == 0:
                im.putpixel((w, h), (a, b, c))

    im.save(str3)


# 原图

old = "D:\\code\\Py\\pycharm\\PIL\\LSB\\img.png"

# 处理后输出的图片路径

new = "D:\\code\\Py\\pycharm\\PIL\\LSB\\imged.png"

# 需要隐藏的信息

enc = "D:\\code\\Py\\pycharm\\PIL\\LSB\\flag.txt"

func(old, enc, new)

Decode

# -*- coding: UTF-8 -*-
from PIL import Image


# Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。
def plus(str):
    return str.zfill(8)


# 获取要隐藏的文件内容
def toasc(strr):
    return int(strr, 2)

def mod(x, y):
    return x % y


# str1为载体图片路径,str2为隐写文件,str3为加密图片保存的路径
def func(length, str1, str2):
    a = ""
    b = ""

    im = Image.open(str1)
    length = length * 8
    # 获取图片的宽和高
    width = im.size[0]
    height = im.size[1]
    count = 0

    # 获取需要隐藏的信息

    for h in range(0, height):
        for w in range(0, width):
            pixel = im.getpixel((w, h))

            if count % 3 == 0:
                count += 1
                a = a + str(mod((int(pixel[0])), 2))
                if count == length:
                    break

            if count % 3 == 1:
                count += 1
                a = a + str(mod((int(pixel[1])), 2))
                if count == length:
                    break

            if count % 3 == 2:
                count += 1
                a = a + str(mod((int(pixel[2])), 2))
                if count == length:
                    break

        if count == length:
            break

    with open(str2, "wb+") as f:
        for i in range(0, len(a), 8):
            strtoascii = toasc(a[i:i + 8])
            f.write((strtoascii.to_bytes(1, 'big')))



pic = "D:\\code\\Py\\pycharm\\PIL\\LSB\\imged.png"

# 需要输出的信息
flag = "D:\\code\\Py\\pycharm\\PIL\\LSB\\Deflag.txt"

func(40, pic, flag)
posted @ 2024-01-23 17:23  zer0_h  阅读(129)  评论(0)    收藏  举报