???筆記目錄
滲透測試工具(1)wireshark
滲透測試工具(2)Nmap
滲透測試工具(3)Burpsuite
AWD比賽(1)AWD入門攻略大綱
CTF-Web(2)SQL注入
CTF-Web(3)文件上傳漏洞
?
圖片隱寫目錄
(1)GIf和二維碼隱寫
- 二維碼補全
- 二維碼繪圖
- Gif規律分析
(2)文本附加圖片隱寫
(3)IHDR文件頭修復圖片寬高
(4)文件拼接
(5)LSB隱寫(不改變圖片)
(6)Exif信息挖掘
(7) 基于DCT域的JPG隱寫
(8)兩張相同圖片
- 異或
- 盲水印
(9)自動拼圖
(10)IDTA隱寫(待完善)
1.Gif和二維碼隱寫
(1)二維碼補全
①抽幀 (StegSolve→Frame Browser)

②二維碼補全四個角(可以截取正常的二維碼角落拼湊新圖)并掃描

(2)二維碼繪圖
①都是01數據
- 把0或1 用黑(255,255,255)或 白(0,0,01)替換
from PIL import Image#todo:修改邊長,假設二維碼是正方形
MAX = 70
pic = Image.new("RGB", (MAX, MAX))
binary_nums = """01組成字符串""".replace('\n', '')i = 0
for y in range(0, MAX):for x in range(0, MAX):if binary_nums[i] == '1':pic.putpixel([x, y], (0, 0, 0))else:pic.putpixel([x, y], (255, 255, 255))i = i + 1pic.show()
pic.save("flag.png")
②坐標繪制二維碼
- 腳本繪圖(數據格式如(1,1) (1,2))
from PIL import Image, ImageDraw, ImageFont, ImageFilter
f1 = open(r'flag.txt','r')
width = 300
height = 300
image = Image.new('RGB', (width, height), (255, 255, 255))
draw = ImageDraw.Draw(image)
color = (0,0,0)
while 1:s = f1.readline()if not s:break#todo:去掉換行符和坐標括號()s = s.strip('\n')s = s.lstrip('(')s = s.rstrip(')')a = int(s.split(',')[0],10)b = int(s.split(',')[1],10)draw.point((a, b), fill=color)
image.show()
(3)Gif規律分析
①黑白規律
思路: 通過捕獲Gif黑白圖片,假設白黑是01或相反,按圖片順序組成二進制串解碼
②像素特征分析
思路: 綠色0、紅色1、黃色換行、熄燈跳過

from PIL import Image#(1)Gif提取所有圖片
im = Image.open('./Traffic_Light.gif')
try:# tell是幀數,而seek是取當前幀數的圖片。im.save('light{0}.png'.format(im.tell()))while True:im.seek(im.tell() + 1)im.save('light{0}.png'.format(im.tell()))
except:pass#(2)分析圖片規律
flag = ""
for i in range(1168):image = Image.open('./light' + str(i) + '.png')#todo:打開畫圖工具根據像素特征分析if image.getpixel((115, 55)) == 213:flag += str(1)elif image.getpixel((115, 145)) == 2:flag += str(0)elif image.getpixel((115, 145)) == 69:print(flag)flag=""
#(3)二進制轉十六進制 再轉ASCII碼# else:# print(flag)# flag=""
2.文本附加圖片隱寫
(1)圖片內容附加字符串
直接在圖片內容中增加字符串
? ? ①winhex預覽
? ? ②破空_flag查找
(2)文件結合
常見形式為可顯示圖片文件=圖片+壓縮包,解決方式:
①foremost分離
②binwalk分離
3.IHDR文件頭修復圖片寬高(圖片顯示不全)
(1)PNG圖片——爆破CRC
【方法一:直接用風二工具梭哈】
①找到圖片crc值

? ? ②腳本爆破CRC 然后修改成正確的高度
import struct
import binascii
m = open("flag.png", "rb").read()
k = 0
for i in range(5000):
????if k == 1:
????????break
????for j in range(5000):
????????c = m[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + m[24:29]
????????crc = binascii.crc32(c) & 0xffffffff
????????if crc == 0x77F34C7D:
????????????# 目標圖片對應的crc值
????????????k = 1
????????????print(i,j)
????????????break
【方法二:無法爆破時 用GIMP 手動調整寬高,顯示出flag】
(2)JPG和BMP
找到Y_image和X_image圖片, 直接修改寬高顯示, 沒有CRC校驗

4.文件拼接
(1)相關命令
copy /b 2.jpg+1.zip output.jpg
5.LSB隱寫(PNG,BMP)
(1)原理
- LSB隱寫就是 修改RGB顏色分量的最低二進制位也就是最低有效位(LSB),而 人眼不會注意到變化,每個像數可以攜帶3比特的信息。

- 可以修改最低位中的信息,實現信息的隱寫。此時 修改 最低有效位的信息的算法就叫做 lsb加密算法, 提取 最低有效位信息的算法叫做 lsb解密算法
(2)lsb解密
?? ?① StegSolve檢測:查看圖片不同通道,進行異或對比操作

②zsteg檢測png和bmp
(3)灰度圖片解密
from PIL import Image
p = Image.open('圖片名.png').convert('L')
#(1)新建大小一樣的圖片
a,b = p.size
flag = Image.new('L',(a,b),255)
#(2)像素為偶數填充黑,奇數白
for y in range(b):for x in range(a):if p.getpixel((x,y))%2==0:flag.putpixel((x,y),255)else:flag.putpixel((x,y),0)
flag.show()
6.Exif信息挖掘(略)
(1)Exif查詢
- exiftool 文件名
- 右鍵屬性查看
7.JPG的DCT域隱寫
(1)原理
JPEG和MPEG格式使用離散余弦變換(DiscreteCosine Transform, DCT)函數來壓縮圖像。 這個圖像壓縮方法的核心是: 通過識別每個8x8像素塊中相鄰像素中的重復像素(如果是MPEG文件的話, 就是識別一系列圖像中相鄰幀中的重復幀)來減少顯示圖像所需的位數, 并使用近似估算法降低其冗余度。?
我們可以把 DCT 看作一個用于執行壓縮的近似計算方法。 因為丟失了部分數據, 所以 DCT 是一種有損壓縮技術, 但一般不會影響圖像或視頻的視覺效果。 ?
Stegdetect 的目的是 評估JPEG文件的 DCT 頻率系數, 把檢測到的可疑JPEG文件的頻率與正常JPEG文件的頻率進行對比。 頻率對比結果的偏差很大則說明被檢查文件存在異常, 這種異常意味著文件中存在隱藏信息的可能性很大。
【常見步驟】
?? ?① stegdetect分析圖片是什么類型隱寫
stegdetect.exe -tjopi -s 10.0 文件名.jpg??

② stegbreak爆破密碼
stegbreak.exe -r rules.ini -f password.txt 文件名.jpg

③不同隱寫工具輸入密碼導出flag(見下)
注意:若stegdetect無法判斷類型,則只能從題目中獲取key密碼,然后采用不同方式導出
(2)JPHide密碼導出
③JPHS輸入密碼導出數據

(3)OutGuess密碼導出(環境未調通,一般需要密碼解密)
【有密碼】
outguess -k xx -r 文件名.jpg
【無密碼】
outguess?-r 文件名.jpg
(4)F5密碼導出(環境未調通)
【有密碼】
java Extract 文件名.jpg -p 密碼
【無密碼】
java Extract 文件名.jpg
8.兩張相同圖片
(1)異或
- 合并兩張圖
Stegsolve → Analysis → Image Combiner
(2)盲水印
- 合并兩張圖(python3 轉為python2)
python bwm.py decode 1.png 2.png flag.png --oldseed
9.拼圖
(1)gas工具
①計算小圖像素塊面積
- 高=704/11=64,寬=1024/16=6,因此圖像塊為 64*64

②gas工具輸入
python gaps --image puzzle.jpg --generation 50 --population 150 --size 64??--verbose
Option??????????| Description
--------------- | -----------
`--image`???????| 拼圖文件
`--size`????????| 每一塊圖像大小
`--generations` | 算法迭代次數 暫時用50
`--population`??| Number of individuals in population
`--verbose`?????|?每次生成后顯示最佳結果(若10次迭代沒更改則退出)
`--save`????????| Save puzzle solution as image
10.IDTA隱寫(待完善)
(1)原理
它存儲實際的數據,在數據流中可包含多個連續順序的圖像數據塊。它采用 LZ77 算法的派生算法進行壓縮,可以用 zlib 解壓縮。
import zlib
import binascii
IDAT = " ".decode('hex')????
#雙引號中填IDAT數據
result = binascii.hexlify(zlib.decompress(IDAT))
print(result)
(2)IDAT長度異常
IDAT 塊只有當上一個塊充滿時,才會繼續一個新的塊。一旦出現不符合這個規律的情況(有一塊IDAT還沒填滿但緊跟其后的是一個新的塊),那么就是人為添加了數據塊
