作者:Yu9(先知社區(qū)) 原文:https://xz.aliyun.com/t/16673?time__1311=Gui%3DYKGILDOD%2FD0ltGkDuCxgDjE7KfBbAeD 場景拿到一個(gè)站,請求和響應(yīng)中的數(shù)據(jù)均經(jīng)過加密,但是我們想在測試中看到明文數(shù)據(jù)并可以修改 前兩天看到0xsdeo師傅的使用雙層mitmproxy代理實(shí)現(xiàn)自動(dòng)化加解密 的思路,今天來實(shí)現(xiàn)一下。 順便回憶一下該場景下使用 Yakit 熱加載進(jìn)行數(shù)據(jù)暴力破解。 思路請求: 設(shè)置下游代理捕獲瀏覽器的請求解密-->Yakit -->上游代理代理再把數(shù)據(jù)加密發(fā)送到服務(wù)端。 響應(yīng): 設(shè)置上游代理捕獲瀏覽器的請求解密-->Yakit -->下游代理代理再把數(shù)據(jù)加密發(fā)送到瀏覽器。
請求自動(dòng)化加解密通過一個(gè)真實(shí)的案例來分析一下 某系統(tǒng) 使用手機(jī)號(hào)進(jìn)行操作,未注冊用戶需完善信息。注冊過的用戶猜測可以直接看到一些敏感信息 現(xiàn)在的思路就是收集手機(jī)號(hào),進(jìn)行爆破。 從數(shù)據(jù)包可以看出來,對登錄的手機(jī)號(hào)進(jìn)行了加密。我們到瀏覽器找一下使用的加密算法 encrypt 通過關(guān)鍵詞搜索直接定位到其代碼邏輯 分析得到
我們可以編寫編寫一個(gè)加解密的代碼 from Crypto.Cipher import AES import base64
def aes_encrypt(plaintext, key, iv): # 將明文轉(zhuǎn)換為字節(jié)串 plaintext = plaintext.encode('utf-8') # 創(chuàng)建AES加密對象,使用CBC模式 cipher = AES.new(key, AES.MODE_CBC, iv) # 計(jì)算需要填充的字節(jié)數(shù) padding_length = AES.block_size - len(plaintext) % AES.block_size # 進(jìn)行填充 padding = bytes([padding_length] * padding_length) plaintext = plaintext + padding # 進(jìn)行加密 ciphertext = cipher.encrypt(plaintext) # 將加密結(jié)果進(jìn)行base64編碼并返回 return base64.b64encode(ciphertext).decode('utf-8')
def aes_encrypt2(plaintext): key = b'60427a4badf685bd' iv = b'0c67da205a1f6f57' return aes_encrypt(plaintext, key, iv)
def aes_decrypt(ciphertext, key, iv): # 對密文進(jìn)行base64解碼 ciphertext = base64.b64decode(ciphertext) # 創(chuàng)建AES解密對象 cipher = AES.new(key, AES.MODE_CBC, iv) # 解密 plaintext = cipher.decrypt(ciphertext) # 去除填充(假設(shè)使用PKCS7填充) padding_length = plaintext[-1] plaintext = plaintext[: -padding_length] return plaintext.decode('utf-8')
def aes_decrypt2(ciphertext): # ciphertext = 'FIUVPgUtB4rcKmBgWY7LeNui4nDwImR52FceKRlDzwU0KdTVkTPtpxyfZ1Zt3eCB' key = '60427a4badf685bd'.encode('utf - 8') iv = '0c67da205a1f6f57'.encode('utf - 8') return aes_decrypt(ciphertext, key, iv) Mitmproxy代理請求下游代理解密使用下游代理把從瀏覽器發(fā)送過來的加密請求數(shù)據(jù)進(jìn)行解密,發(fā)送給 Yakit
啟動(dòng) mitmdump -q -p 8888 -s .\aes_decrypt.py --mode upstream:http://127.0.0.1:8083/ --ssl-insecure 瀏覽器代理 此時(shí)到 Yakit 的數(shù)據(jù)包已經(jīng)是明文了 現(xiàn)在需要解決的問題就是還需把數(shù)據(jù)在加密返回給服務(wù)端,這是就需要在設(shè)置一個(gè)上游代理來進(jìn)行加密操作 上游代理加密使用上游代理把從 Yakit發(fā)送過來的加密請求數(shù)據(jù)進(jìn)行加密,發(fā)送給服務(wù)端
啟動(dòng) mitmdump -q -p 8989 -s .\aes_encrypt.py 響應(yīng)上游代理解密使用上游代理把從服務(wù)端發(fā)送過來的加密請求數(shù)據(jù)進(jìn)行解密,發(fā)送給 Yakit
下游代理加密使用下游代理把從 Yakit發(fā)送過來的加密請求數(shù)據(jù)進(jìn)行解密,發(fā)送給瀏覽器 def response(flow: HTTPFlow): # burp下游代理: 把從burp獲取到的解密響應(yīng)數(shù)據(jù)重新進(jìn)行加密,發(fā)送給瀏覽器,使瀏覽器頁面能夠渲染數(shù)據(jù) try: if '/iccm/h5/visitor/' in flow.request.url: data = json.loads(flow.response.content.decode()) if data: decrypt_text = json.dumps(data) print('響應(yīng)加密數(shù)據(jù):', decrypt_text) decrypt_text = data['data'] decrypt_text = json.dumps(decrypt_text) # 加密 encrypt_text = aes_encrypt2(decrypt_text)
# 合并數(shù)據(jù) data['data'] = encrypt_text encrypt_text = json.dumps(data, ensure_ascii=False)
print('響應(yīng)加密數(shù)據(jù):', encrypt_text) flow.response.content = encrypt_text.encode() except Exception as e: pass 最終效果經(jīng)過 yakit 的數(shù)據(jù)已經(jīng)變成明文,加密前后對比 解密前解密后Yakit 熱加載-爆破如果只是單純的爆破數(shù)據(jù)的話,個(gè)人感覺使用 Yakit 更為簡單。 詳細(xì):https://mp.weixin.qq.com/s/x-A-ZWqE8C-HN6k9Y2QBbw 熱加載模塊中編寫代碼:
調(diào)試 效果 總結(jié)最后也是成功爆破除出了一些可利用手機(jī)號(hào),并和剛開始的猜想一樣,泄露了一些敏感數(shù)據(jù) |
|