安基網 首頁 編程 Python 查看內容

「Python黑帽」 獲取注冊表、U盤歷史痕跡和回收站文件

2020-9-17 08:55| 投稿: xiaotiger |來自: 互聯網


免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!

摘要: 最近開始學習網絡安全和系統安全,接觸到了很多新術語、新方法和新工具,作為一名初學者,感覺安全領域涉及的知識好廣、好雜,但同時也非常有意思。這系列文章是作者學習安全過程中的總結和探索,我們一起去躺過那些坑、跨過那些洞、守住那些站,真心希望文章對您有所幫助,感謝您的閱讀和關注。Python ...

最近開始學習網絡安全和系統安全,接觸到了很多新術語、新方法和新工具,作為一名初學者,感覺安全領域涉及的知識好廣、好雜,但同時也非常有意思。這系列文章是作者學習安全過程中的總結和探索,我們一起去過那些坑、跨過那些洞、守住那些站,真心希望文章對您有所幫助,感謝您的閱讀和關注。

Python黑帽第一篇文章將分享獲取Windows主機信息,利用注冊表獲取主機名及USB歷史痕跡、回收站文件等,這些知識廣泛應用于電子取證、Web滲透和攻擊溯源領域,其中USB獲取是亮點。希望這篇基礎文章對您有所幫助,更希望大家提高安全意識,學會相關防范,也歡迎大家討論。娜璋AI安全之家于2020年8月18日開通,將專注于Python和安全技術,主要分享Web滲透、系統安全、CVE復現、威脅情報分析、人工智能、大數據分析、惡意代碼檢測等文章。真心想把自己近十年的所學所做所感分享出來,與大家一起進步。


聲明:本人堅決反對利用教學方法進行惡意攻擊的行為,一切錯誤的行為必將受到嚴懲,綠色網絡需要我們共同維護,更推薦大家了解技術背后的原理,更好地進行安全防護。雖然作者是一名安全小白,但會保證每一篇文章都會很用心地撰寫,希望這些基礎性文章對你有所幫助,在安全路上一起前行。

一.獲取Windows主機信息

WMI(Windows Management Instrumentation) 是一項核心的Windows管理技術,WMI模塊可用于獲取Windows內部信息。WMI作為一種規范和基礎結構,通過它可以訪問、配置、管理和監視幾乎所有的Windows資源,比如用戶可以在遠程計算機器上啟動一個進程;設定一個在特定日期和時間運行的進程;遠程啟動計算機;獲得本地或遠程計算機的已安裝程序列表;查詢本地或遠程計算機的Windows事件日志等等。

本文使用Python獲取Windows系統上相關的信息可以使用WMI接口,安裝調用PIP工具即可。

  • pip install wmi
  • import wmi

下面的代碼是獲取Windows主機相關信息。

import wmi
import os
import socket

w = wmi.WMI()

#獲取電腦使用者信息
for CS in w.Win32_ComputerSystem():
#print(CS)
print("電腦名稱: %s" %CS.Caption)
print("使用者: %s" %CS.UserName)
print("制造商: %s" %CS.Manufacturer)
print("系統信息: %s" %CS.SystemFamily)
print("工作組: %s" %CS.Workgroup)
print("機器型號: %s" %CS.model)
print("")

#獲取操作系統信息
for OS in w.Win32_OperatingSystem():
#print(OS)
print("操作系統: %s" %OS.Caption)
print("語言版本: %s" %OS.MUILanguages)
print("系統位數: %s" %OS.OSArchitecture)
print("注冊人: %s" %OS.RegisteredUser)
print("系統驅動: %s" %OS.SystemDevice)
print("系統目錄: %s" %OS.SystemDirectory)
print("")

#獲取電腦IP和MAC信息
for address in w.Win32_NetworkAdapterConfiguration(ServiceName = "e1dexpress"):
#print(address)
print("IP地址: %s" % address.IPAddress)
print("MAC地址: %s" % address.MACAddress)
print("網絡描述: %s" % address.Description)
print("")

#獲取電腦CPU信息
for processor in w.Win32_Processor():
#print(processor)
print("CPU型號: %s" % processor.Name.strip())
print("CPU核數: %s" % processor.NumberOfCores)
print("")

#獲取BIOS信息
for BIOS in w.Win32_BIOS():
#print(BIOS)
print("使用日期: %s" %BIOS.Description)
print("主板型號: %s" %BIOS.SerialNumber)
print("當前語言: %s" %BIOS.CurrentLanguage)
print("")

#獲取內存信息
for memModule in w.Win32_PhysicalMemory():
totalMemSize = int(memModule.Capacity)
print("內存廠商: %s" %memModule.Manufacturer)
print("內存型號: %s" %memModule.PartNumber)
print("內存大小: %.2fGB" %(totalMemSize/1024**3))
print("")

#獲取磁盤信息
for disk in w.Win32_DiskDrive():
diskSize = int(disk.size)
print("磁盤名稱: %s" %disk.Caption)
print("硬盤型號: %s" %disk.Model)
print("磁盤大小: %.2fGB" %(diskSize/1024**3))

#獲取顯卡信息
for xk in w.Win32_VideoController():
print("顯卡名稱: %s" %xk.name)
print("")

#獲取計算機名稱和IP
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
print("計算機名稱: %s" %hostname)
print("IP地址: %s" %ip)

輸出結果如下圖所示:



二.獲取Windows注冊表信息

1.注冊表基本結構

注冊表(Registry)是Windows系統中一個重要的數據庫,它用于存儲有關應用程序、用戶和系統信息。注冊表的結構就像一顆樹,樹的頂級節點(hive)不能添加、修改和刪除,如下圖所示是Windows注冊表的頂級節點。

在C#中對注冊表進行操作,需要引用命名空間using Microsoft.Win32。

  • RegistryKey類:表示注冊表中的頂級結點,此類是注冊表的封裝。
  • Registry類:提供表示Windows注冊表中的根項RegistryKey對象,并提供訪問項/值的static方法。常用的Registry對象的頂級節點(蜂窩,hive)的屬性如下表所示:

注冊表中常用的數據類型有:

  • REG_SZ:字符串數據的主要類型,用于存儲固定長度的字符串或其他短文本值。我們在實際程序中常用這種數據類型,如果要保存布爾值時,將它表示成0或1。
  • REG_BINARY:用于存儲二進制數據。
  • REG_EXPAND_SZ:可擴展的字符串值,可以保存在運行時才解析的系統變量。
  • REG_MULTI_SZ:以數組的格式保存多個文本字符串,每個字符串"元素"都以null字符結束。



2.注冊表基本操作

Python注冊表操作主要調用winreg擴展包。官方文檔如下:

  • https://docs.python.org/3.0/library/winreg.html

基本操作函數如下:

(1) 創建操作

  • winreg.ConnectRegistry(computer_name, key)
    與計算機的預定義注冊表句柄建立連接
  • winreg.CreateKey(key, sub_key)
    創建或打開指定的鍵

例如在HKEY_CURRENT_USER下創建鍵Eastmount,其中我們最常用的是在Software這個鍵下創建程序產品鍵,保存一些程序的配置在注冊表中。如果Software中沒有Eastmount鍵,則會先創建這個鍵及其子鍵,如果存在就不會重寫。

import winreg as wg

#創建鍵
subDir = r"SoftwareMicrosoftWindowsCurrentVersionExplorer"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER, subDir)
wg.CreateKey(key_test, 'Eastmount')
wg.CloseKey(key_test)

運行結果如下:


(2) 檢索鍵值操作

  • winreg.QueryInfoKey(key)
    以元組形式返回鍵的信息
  • winreg.QueryValue(key, sub_key)
    以字符串形式檢索鍵的未命名值
  • winreg.QueryValueEx(key, value_name)
    檢索與打開注冊表項關聯的指定值名稱的類型和數據

在Eastmount下面新建一個值yxz,內容為“hello na”,然后編寫代碼讀取相關的內容。

#獲取鍵值數據項值
subDir = r"SoftwareMicrosoftWindowsCurrentVersionExplorerEastmount"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER, subDir)
value,type_ = wg.QueryValueEx(key_test,'yxz')
print(value)
print(type_)

輸出結果如下圖所示:


(3) 創建鍵值操作

  • winreg.SetValue(key, sub_key, type, value)
    將值與指定的鍵關聯
  • winreg.SetValueEx(key, value_name, reserved, type, value)
    將數據存儲在打開的注冊表項Value字段中

創建鍵值代碼如下,但會提示PermissionError: [WinError 5] 拒絕訪問錯誤。

#創建鍵值數據項
subDir = r"SoftwareMicrosoftWindowsCurrentVersionExplorerEastmount"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER, subDir)
print(key_test)
#PermissionError: [WinError 5] 拒絕訪問
wg.SetValueEx(key_test,'data','',wg.REG_SZ,'0')
wg.CloseKey(key_test)

(4) 刪除鍵值操作

  • winreg.DeleteKey(key, sub_key)
    刪除指定的鍵
  • winreg.DeleteValue(key, value)
    從注冊表項中刪除值
#刪除鍵值數據項
subDir = r"SoftwareMicrosoftWindowsCurrentVersionExplorerEastmount"
key_test = wg.OpenKey(wg.HKEY_CURRENT_USER,subDir,0,wg.KEY_WRITE)
wg.DeleteValue(key_test,'yxz')
wg.CloseKey(key_test)

成功刪除鍵值,如下圖所示。


(5) 其他操作

  • winreg.EnumKey(key, index)
    枚舉打開注冊表的鍵
  • winreg.EnumValue(key, index)
    枚舉打開注冊表項的值
  • winreg.OpenKey(key, sub_key,sam=KEY_READ)
    打開指定鍵
  • winreg.FlushKey(key)
    刷新注冊表
  • winreg.LoadKey(key, sub_key, file_name)
    在指定鍵下創建一個子鍵,并將注冊信息從指定文件存儲到該子鍵中



3.獲取用戶賬戶信息

獲取用戶名稱的代碼如下:

# encoding:utf-8
from winreg import *
import sys

#連接注冊表根鍵 以HKEY_LOCAL_MACHINE為例
regRoot = ConnectRegistry(None, HKEY_LOCAL_MACHINE)
subDir = r'SOFTWAREMicrosoftWindows NTCurrentVersionProfileList'

#獲取指定目錄下所有鍵的控制
keyHandle = OpenKey(regRoot, subDir)

#獲取該目錄下所有鍵的個數(0-下屬鍵個數 1-當前鍵值個數)
count = QueryInfoKey(keyHandle)[0]
for i in range(count):
#窮舉鍵獲取鍵名
subKeyName = EnumKey(keyHandle, i)
subDir_2 = r'%s%s' % (subDir, subKeyName)

#根據獲取的鍵名拼接之前的路徑作為參數 獲取當前鍵下所屬鍵的控制
keyHandle_2 = OpenKey(regRoot, subDir_2)
num = QueryInfoKey(keyHandle_2)[1]
for j in range(num):
name, value, type_ = EnumValue(keyHandle_2, j)
if('ProfileImagePath' in name and 'Users' in value):
print(value)
#讀寫操作結束后關閉鍵
CloseKey(keyHandle_2)

CloseKey(keyHandle)
CloseKey(regRoot)

執行結果如下,我們可以通過讀取含有Users字段的數據,從而間接獲取用戶賬戶信息。

C:Usersxiuzhang



三.獲取回收站內容

為什么我們要去獲取回收站文件呢?因為很多情況下調查取證需要獲取遠程目標的歷史痕跡,回收站是重要的一個目標。在Windows操作系統中,回收站是一個專門用來存放被刪除文件的特色文件夾。

在使用FAT文件系統的Windows98系統中,回收站目錄通常是C:Recycled;在Windows NT2000、Windows XP在內支持的NTFS操作系統中,C:Recycler;在Windows Vista和Windows7中,回收站目錄是C:$Recycle.Bin。如下圖所示,回收站中包含兩個文件,分別位于桌面和D盤目錄。


第一步,檢測回收站目錄是否存在。

import os

def returnDir():
#定義回收站目錄
dirs = ['C:Recycler', 'C:Recycled', 'C:$Recycle.Bin']
for recycleDir in dirs:
if os.path.isdir(recycleDir):
return recycleDir
return None

#調用函數
res = returnDir()
print(res) #C:$Recycle.Bin

Windows10操作系統輸出結果如下圖所示:

第二步,找到回收站之后,檢測其中的內容,如下圖所示,字符串SID與用戶賬戶名是對應的,比如1001結尾的SID。

第三步,編寫代碼獲取回收站文件夾所在目錄。

import os

#判斷回收站目錄是否存在
def returnDir():
dirs = ['C:Recycler', 'C:Recycled', 'C:$Recycle.Bin']
for recycleDir in dirs:
if os.path.isdir(recycleDir):
return recycleDir
return None

#獲取回收站內容
def findRecycle(recycleDir):
dirList = os.listdir(recycleDir)
for sid in dirList:
print(sid)
files = os.listdir(recycleDir+sid)
print(files,"n")

#主函數
def main():
res = returnDir()
print(res) #C:$Recycle.Bin
findRecycle(res)

if __name__ == '__main__':
main()

輸出結果如下圖所示:

第四步,用python將用戶的SID關聯起來,使用Windows注冊表將SID轉化為一個準確的用戶名。

  • 通過檢查Windows注冊表鍵值
  • HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionProfileListProfileImagePath

編寫一個函數來將每一個SID轉化為用戶名,這個函數將打開注冊便檢查ProfileImagePath鍵值,找到其值并從中找到用戶名。

如下圖所示,用戶名為“xiuzhang”。

第五步,獲取回收站所有內容。
完整代碼:

import os
import winreg

#判斷回收站目錄是否存在
def returnDir():
dirs = ['C:Recycler', 'C:Recycled', 'C:$Recycle.Bin']
for recycleDir in dirs:
if os.path.isdir(recycleDir):
return recycleDir
return None

#通過sid獲取用戶名信息
def sid2user(sid):
try:
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,
"SOFTWAREMicrosoftWindows NTCurrentVersionProfileList" + sid)
#獲取該目錄下所有鍵的個數: 0-下屬鍵個數; 1-當前鍵值個數
count = winreg.QueryInfoKey(key)[1]
for j in range(count):
#FileNotFoundError: [WinError 2] 系統找不到指定的文件
#(value, type) = winreg.QueryValue(key, 'ProfileImagePath')
name, value, type = winreg.EnumValue(key, j)
if('ProfileImagePath' in name):
user = value.split('')[-1]
#print(user)
return user
except:
return sid

#獲取回收站內容
def findRecycle(recycleDir):
dirList = os.listdir(recycleDir)
for sid in dirList:
print(sid)
files = os.listdir(recycleDir+sid)
print(files)
user = sid2user(sid)
print('[*]Listing Files For User:' + str(user))
for file in files:
print('[+]Found File:' + str(file))
print("")

#主函數
def main():
res = returnDir()
print(res) #C:$Recycle.Bin
findRecycle(res)

if __name__ == '__main__':
main()

輸出結果如下圖所示:

對應的回收站內容如下,但非常可惜獲取的值無法對應,why?后續作者會繼續深入挖掘。




如果我們想把文件刪除到回收站,又怎么解決呢?Python刪除文件一般使用os.remove,但這樣是直接刪除文件,不刪到回收站的,那么想刪除文件到回收站怎么辦?

(1) 安裝pypiwin32擴展包(含win32api)。

(2) 調用SHFileOperation函數實現刪除文件至回收站。

在Windows的shellapi文件中定義了一個名為SHFileOperation的外殼函數,用它可以實現各種文件操作,如文件的拷貝、刪除、移動等,該函數使用起來非常簡單,它只有一個指向SHFILEOPSTRUCT結構的參數。

from win32com.shell import shell,shellcon
import os

debug = False
def deltoreCyclebin(filename):
#直接刪除文件,不經過回收站
#os.remove(filename)
if not debug:
#刪除文件到回收站
res = shell.SHFileOperation((0,
shellcon.FO_DELETE,
filename,
None,
shellcon.FOF_SILENT | shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION,
None,
None))
print(res)
if not res[1]:
os.system('del '+ filename)

if __name__ == '__main__':
filename = "C:UsersxiuzhangDesktoprequire.rb"
deltoreCyclebin(filename)

最終效果如下圖所示,可以看到require.rb文件被成功刪除。

可能會遇到“PermissionError: [WinError 5] 拒絕訪問”問題,我們需要設置Python.exe用戶名完全控制,并且用管理員方式打開即可解決。



四.獲取U盤痕跡

在Windows系統中,當一個USB移動存儲設備插入時,就會在注冊表中留下痕跡。當移動設備插入計算機時,即插即用管理器PnP(Plug and Play)接受該事件,并且在USB設備的固件(Firewre information)中查詢有關該設備的描述信息(廠商、型號、序列號等)。當設備被識別后,在注冊表中創建一個新的鍵值:

  • HKEY_LOCAL_MACHINESYSTEMCurrentControlSetEnumUSBSTOR

在這個鍵值下,會看到類似下面的結構子鍵,該子鍵代表設備類標示符,用來標識設備的一個特定類。

  • Disk&Ven_###&Prod_###&Rev_###

其中,子鍵中"###"代表區域由PnP管理器依據在USB設備描述符中獲取的數據填寫。如下圖所示:

  • Disk&Ven_aigo&Prod_Miniking&Rev_8.07是Device class ID
  • Q0UKCH37&0是Unique instance ID(UID)

注意需要判斷Service值為disk,即為磁盤的子項,光盤為cdrom。

如果使用UVCView工具可以看見USB設備描述內容,其中的信息都是相互對應的。設備類ID一旦建立,就需要建立一個特定唯一的UID,它可以把具有同一設備類標識的多個存儲設備區分。

完整實現代碼如下:

# encoding:utf-8
from winreg import *
import sys

usb_name = []
uid_flag = []
usb_path = []

#連接注冊表根鍵 以HKEY_LOCAL_MACHINE為例
regRoot = ConnectRegistry(None, HKEY_LOCAL_MACHINE)

#檢索子項
subDir = r"SYSTEMCurrentControlSetEnumUSBSTOR"

#獲取指定目錄下所有鍵的控制
keyHandle = OpenKey(regRoot, subDir)

#獲取該目錄下所有鍵的個數(0-下屬鍵個數 1-當前鍵值個數)
count = QueryInfoKey(keyHandle)[0]
print(count)

#窮舉USBSTOR鍵獲取鍵名
for i in range(count):
subKeyName = EnumKey(keyHandle, i)
subDir_2 = r'%s%s' % (subDir, subKeyName)
#print(subDir_2)

#根據獲取的鍵名拼接之前的路徑作為參數 獲取當前鍵下所屬鍵的控制
keyHandle_2 = OpenKey(regRoot, subDir_2)
num = QueryInfoKey(keyHandle_2)[0]
#遍歷子鍵內容
for j in range(num):
subKeyName_2 = EnumKey(keyHandle_2, j)
#print(subKeyName_2)
result_path = r'%s%s' % (subDir_2, subKeyName_2)

#獲取具體鍵值內容并判斷Service為disk
keyHandle_3 = OpenKey(regRoot, result_path)
numKey = QueryInfoKey(keyHandle_3)[1]
for k in range(numKey):
#獲取USB名稱
name, value, type_ = EnumValue(keyHandle_3, k)
if(('Service' in name) and ('disk'in value)):
value,type_ = QueryValueEx(keyHandle_3,'FriendlyName')
usb = value
uid = subKeyName_2
path = "USBSTOR" + "" + subKeyName + "" + subKeyName_2
print(usb)
print(uid)
print(path)
print("")

#關閉鍵值
CloseKey(keyHandle)
CloseKey(regRoot)

輸出的USB記錄鍵名如下圖所示:

其中對應的注冊表信息如下圖所示,FriendlyName即是輸出的“USB名稱 Kingston DataTraveler 2.0 USB Device”,UID序號為“C860008862F1EE501A0F0105&0”,搜索的Service(服務)為disk(磁盤)的選項。


簡單總結:

個人感覺這方面的資料真心很少,文章博客也少,所以看起來操作似乎很簡單,但真正實現起來還是令人深思的。然后就是其實存儲USB記錄的還有很多鍵值,如

  • HKEY_LOCAL_MACHINESYSTEMCurrentControlSetEnumUSB
    該鍵值中能看到廠商號(VID_)、廠商產品號(PID_),還有LocationInformation(端口號) Port_#0001.Hub_#0005等。

  • HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlDeviceClasses
    該鍵值下有兩個設備類:{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}{53F5630d-B6BF-11D0-94F2-00A0C91EFB8B},可以通過他們獲取USB最后接入系統時間。

接下來我想要完成的就是如何把這些鍵值聯系起來,似乎要通過Dictionary,同時怎樣獲取時間,怎樣正確刪除這些信息都值得深究。


更多黑客教程,搭建釣魚網站,如何反盜別人的賬號 記得私信小編01獲取


五.總結

這篇文章真的花費了一些精力,希望您喜歡。同時感覺自己要學習的知識好多,也有好多大神臥虎藏龍,開源分享。作為初學者,我們可能有差距,不論你之前是什么方向,是什么工作,是什么學歷,是大學大專中專,亦或是高中初中,只要你喜歡安全,喜歡滲透,就朝著這個目標去努力吧!有差距不可怕,我們需要的是去縮小差距,去戰斗,況且這個學習的歷程真的很美,安全真的有意思。但切勿去做壞事,我們需要的是白帽子,是維護我們的網絡,安全路上共勉。

此文轉載于:Eastmount

著作權歸作者所有,如有侵權聯系小編刪除!

原文地址:https://blog.csdn.net/Eastmount/article/details



小編推薦:欲學習電腦技術、系統維護、網絡管理、編程開發和安全攻防等高端IT技術,請 點擊這里 注冊賬號,公開課頻道價值萬元IT培訓教程免費學,讓您少走彎路、事半功倍,好工作升職加薪!

本文出自:https://www.toutiao.com/i6872584600867045902/

免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!


鮮花

握手

雷人

路過

雞蛋

相關閱讀

最新評論

 最新
返回頂部
创业如何赚钱 上海十一选五走势图 localhost 七乐彩几个号才中奖 浙江11选五基本走势图 黑龙江11选5任5遗漏 开奖结果360 一定牛重庆快乐10分走势图 北京期货配资网 江西11选5开奖结果 山东扑克玩法 黑龙省11选五走势图 急速赛车游戏下载 福建十一选五开奖号码查询 安徽快三全天计划 广东快乐12开奖结果图 广东11选5玩法介绍 深大通股票最新消息