公司新聞
在這篇文章中,我們將介紹一些在基于Linux的設(shè)備上通過利用Python庫和腳本提升權(quán)限的方法。
1.介紹
一般來說,當(dāng)攻擊者處于有python文件的環(huán)境中,可以用來提升其訪問權(quán)限的方式比較有限。本文將介紹利用寫權(quán)限、sudo權(quán)限和編輯Path變量,這三種提權(quán)方式。
為了方便演示,我們先創(chuàng)建一個(gè)導(dǎo)入一些庫的示例腳本。在實(shí)際情況中,這可能是個(gè)一般的python腳本或是一個(gè)開發(fā)人員正在進(jìn)行的項(xiàng)目。在CTF比賽中,可能很容易找到一個(gè)包含與此相類似的腳本。我們創(chuàng)建的示例腳本中,首先導(dǎo)入webbrowser模塊,然后使用open函數(shù)來運(yùn)行設(shè)備上的默認(rèn)web瀏覽器,來打開http://m.delawaredebtrecovery.com/網(wǎng)頁(此處以任子行官網(wǎng)舉例),如圖1-1。
圖1-1可以看到運(yùn)行腳本程序會打開任子行官網(wǎng)
方法一:這個(gè)漏洞利用是基于我們導(dǎo)入的模塊文件要具有寫權(quán)限。當(dāng)被導(dǎo)入的模塊文件具有允許任何用戶編輯的權(quán)限時(shí),它就可能成為一個(gè)漏洞。在我們創(chuàng)建的python示例腳本中,調(diào)用了webbrowser.py模塊文件。為了更好地了解這種提權(quán)方式,我們將首先在ubuntu環(huán)境中創(chuàng)建脆弱性漏洞環(huán)境,然后使用另一個(gè)機(jī)器來攻擊利用這個(gè)漏洞。
漏洞創(chuàng)建:正如前文所講,在這種方法中,漏洞是基于模塊文件的權(quán)限。為了構(gòu)造這個(gè)漏洞,我們首先需要找到模塊文件。我們可以用locate命令來找到它,當(dāng)然也可以利用find之類的命令進(jìn)行查找。我們可以看到它位于/usr/lib/python3.8/里面,然后我們可以看到,模塊文件的默認(rèn)權(quán)限是:所有者有讀、寫、執(zhí)行的權(quán)限,組有執(zhí)行和讀的權(quán)限,其他用戶只有執(zhí)行的權(quán)限。這意味著除非用戶是root權(quán)限,否則任何人不能編輯該文件。為了構(gòu)造這個(gè)漏洞,我們需要用chmod命令改變一下權(quán)限,使每個(gè)用戶都可以讀取、寫入和執(zhí)行。這從下圖1-2中可以看到。
圖1-2可以看到所有用戶對文件具有讀,寫,執(zhí)行權(quán)限。
要想讓Linux機(jī)器變得易受攻擊,下一步要做的就是提供一個(gè)運(yùn)行python腳本的方法。最簡單的方法是寫入sudoers文件中,這樣攻擊者(可以訪問用戶lele)就可以執(zhí)行我們創(chuàng)建的python腳本(hack.py)。如圖1-3.
圖1-3
以上就是一個(gè)完整使機(jī)器容易受到Python庫劫持的攻擊的過程,其余沒有提到的配置都為Linux的默認(rèn)配置。
漏洞利用:該漏洞利用的前提是我們在目標(biāo)機(jī)上已經(jīng)獲得初始立足點(diǎn)。然后我們可以利用這種方法在獲得初始立足點(diǎn)后提升權(quán)限。為了模仿這種情況,我們先以用戶lele的身份連接到目標(biāo)機(jī)。作為一個(gè)需要提升權(quán)限的攻擊者,我們運(yùn)行sudo -l命令,看看哪些腳本或二進(jìn)制文件是以提升的權(quán)限運(yùn)行的??梢钥吹剑覀兡?span style="line-height: 150%; font-family: 宋體;">使用python3.8來運(yùn)行hack.py。作為一個(gè)攻擊者,我們使用cat命令查看腳本內(nèi)容,看到它導(dǎo)入一個(gè)名為webbrowser的模塊。我們使用locate命令找到該模塊的位置,發(fā)現(xiàn)它位于/usr/lib/python3.8中。然后我們還可以發(fā)現(xiàn)lele用戶擁有該模塊的寫權(quán)限。如圖1-4,圖1-5所示。
圖1-4可以看到哪些腳本擁有root權(quán)限
圖1-5可以看到目標(biāo)腳本所處位置
我們用vim編輯器打開該模塊文件,然后在被hack.py文件調(diào)用的函數(shù)里面加入了反彈shell的python腳本。在前面我們可以看到,它使用一個(gè)open函數(shù)在瀏覽器中打開了一個(gè)網(wǎng)頁。因此,我們將反彈shell的代碼添加到該模塊文件中,如下圖1-6所示。
vim /usr/lib/python3.8/webbrowser.py
圖1-6將反彈shell的代碼寫入圖中位置
編輯完模塊文件后,我們保存并關(guān)閉編輯器。打開ctf機(jī)器的另一臺終端,我們在shellcode腳本中指定的端口上打開一個(gè)Netcat監(jiān)聽器,然后以lele用戶回到終端,用sudo執(zhí)行hack.py腳本,如圖1-7所示。
圖1-7
當(dāng)腳本運(yùn)行時(shí),我們就可以看到一個(gè)會話連接到了我們的Netcat監(jiān)聽器。通過whoami命令和id命令可以看到我們已經(jīng)成功地將Linux權(quán)限從lele用戶提升到了root權(quán)限用戶。
方法二:
這個(gè)漏洞是基于Python庫路徑的優(yōu)先級順序,它適用于我們腳本正在導(dǎo)入的模塊文件。當(dāng)一個(gè)模塊在腳本中被導(dǎo)入時(shí),Python會以特定的優(yōu)先順序在默認(rèn)目錄中尋找特定的模塊文件。在我們創(chuàng)建的python腳本中,我們有webbrowser.py模塊文件被調(diào)用。因?yàn)槿绻谂c原始腳本相同的目錄下存在一個(gè)Python模塊文件,它將獲得優(yōu)先于默認(rèn)路徑的地位。為了更好地了解背后發(fā)生了什么,以及怎么樣導(dǎo)致權(quán)限升級的,我們先在ubuntu環(huán)境中創(chuàng)建漏洞,然后使用另一個(gè)機(jī)器Linux來利用這個(gè)漏洞。
漏洞構(gòu)建:
正如前面所討論的,在這種方法中,漏洞是基于模塊文件執(zhí)行的優(yōu)先順序。為了構(gòu)造這個(gè)漏洞,首先,我們需要把方法一加入的反彈shell的代碼注釋掉或者直接刪掉(如圖2-1),避免產(chǎn)生干擾,然后恢復(fù)我們先前賦予文件的權(quán)限(如圖2-2)。這樣,這臺機(jī)器就不會在多個(gè)方面出現(xiàn)漏洞。
圖2-1 注釋掉先前加的反彈shell代碼
圖2-2恢復(fù)webbrowser.py的權(quán)限。
接下來,我們回到我們先前創(chuàng)建的python腳本。我們可以看到,它位于lele用戶的home目錄下,它仍然包含相同的代碼,需要導(dǎo)入 webbrowser模塊,如圖2-3所示。
圖2-3
sudoers文件中與方法一中的編寫一致,使其包含腳本hack.py的正確路徑,如圖2-4所示。
圖2-4
以上是一個(gè)完整的使機(jī)器容易受到Python庫劫持的攻擊過程。其余沒有提到的配置都為Linux的默認(rèn)配置。
漏洞利用:
同樣,該漏洞利用的前提是我們在目標(biāo)機(jī)上已經(jīng)獲得初始立足點(diǎn)。然后我們可以利用這種方法在獲得初始立足點(diǎn)后提升權(quán)限。為了模仿這種情況,我們以用戶lele的身份連接到目標(biāo)機(jī)器。作為一個(gè)需要提升權(quán)限的攻擊者,我們運(yùn)行sudo -l命令,看看我們可以用哪些腳本或二進(jìn)制文件是以提升的權(quán)限運(yùn)行的。我們看到,我們可以使用python3.8來運(yùn)行hack.py。作為一個(gè)攻擊者,我們使用cat命令查看該腳本,看到它導(dǎo)入了一個(gè)名為webbrowser的模塊,如圖2-5。
圖2-5
由于 hack.py 位于 lele 用戶的主目錄內(nèi),而我們有 lele 用戶的訪問權(quán)限,我們可以在主目錄內(nèi)創(chuàng)建一個(gè)文件。在這種情況下,需要注意的是我們不能編輯 hack.py 文件。在這種情況下,我們將創(chuàng)建一個(gè)webbrowser.py文件。然后在創(chuàng)建的webbrowser.py文件中添加反彈shell的代碼。如圖2-6
圖2-6 反彈shell代碼
接下來,我們需要運(yùn)行一個(gè)Netcat偵聽器端口,我們提到在反向shellcode。然后我們將繼續(xù)使用sudo執(zhí)行hakc.py腳本,如圖2-7。
圖2-7
當(dāng)腳本運(yùn)行時(shí),我們看到一個(gè)會話連接到Netcat偵聽器。會話的id命令證明在目標(biāo)機(jī)器上已經(jīng)是root權(quán)限。我們已經(jīng)成功地把lele用戶提升特權(quán)為root用戶,如圖2-8。
圖2-8提權(quán)為root權(quán)限
方法3
這個(gè)漏洞是通過Python PATH環(huán)境變量進(jìn)行搜索的Python庫來利用的。這個(gè)變量有一個(gè)目錄列表,在這個(gè)列表中,Python會搜索導(dǎo)入模塊的不同目錄。如果攻擊者能夠改變或修改該變量,那么他們就可以利用它來提升目標(biāo)機(jī)器的權(quán)限。為了更好地了解是怎么樣導(dǎo)致權(quán)限升級的,我們和前面一樣先在ubuntu環(huán)境中創(chuàng)建漏洞,然后使用另一臺Linux來攻擊利用這個(gè)漏洞。
漏洞構(gòu)建
正如前面所討論的,這個(gè)方法的漏洞利用是基于python環(huán)境path變量的。為了構(gòu)造這個(gè)漏洞,首先,和前面一樣,我們需要恢復(fù)Linux環(huán)境到最初的配置。然后,在tmp目錄內(nèi)創(chuàng)建hack.py腳本,我們可以驗(yàn)證該腳本的內(nèi)容與之前一樣,如圖3-1,圖3-2所示。
圖3-1運(yùn)行該腳本會打開任子行官網(wǎng)
圖3-2 可以看到腳本內(nèi)容
接下來,我們需要在sudoers文件中做一些修改。首先,我們把文件的位置改為/tmp目錄,然后在文件中加入SETENV標(biāo)記,如圖3-3所示。這意味著lele用戶可以使用具有sudo權(quán)限的SETENV命令,而無需輸入root密碼。SETENV是個(gè)可以改變Python PATH環(huán)境變量的值,并將任何位置納入我們在前面的方法中學(xué)到的執(zhí)行順序的命令。
圖3-3給我們的文件加上SETENV標(biāo)記配置環(huán)境變量
以上就是使機(jī)器容易受到Python庫劫持的完整過程。其余沒有提到的配置都被設(shè)置為Linux的默認(rèn)配置。
漏洞利用
同樣,該漏洞利用的前提是我們在目標(biāo)機(jī)上已經(jīng)獲得初始立足點(diǎn)。然后我們可以利用這種方法在獲得初始立足點(diǎn)后提升權(quán)限。為了模仿這種情況,我們以用戶lele的身份連接到目標(biāo)機(jī)器。作為一個(gè)需要提升權(quán)限的攻擊者,我們運(yùn)行sudo -l命令,看看我們可以用哪些腳本或二進(jìn)制文件是以提升的權(quán)限運(yùn)行的。我們看到,我們可以用root權(quán)限使用SETENV,這意味著我們可以用它來改變導(dǎo)入模塊的優(yōu)先順序。由于hack.py位于/tmp目錄內(nèi),我們進(jìn)入其中并檢查hack.py腳本,如圖3-4所示。
圖3-4 可以看到已經(jīng)以root權(quán)限進(jìn)行設(shè)置環(huán)境變量
由于它需要導(dǎo)入webbrowser模塊,我們首先將創(chuàng)建一個(gè)名為webbrowser.py的惡意模塊文件,然后利用改變環(huán)境變量Python PATH的能力導(dǎo)入我們的惡意模塊文件,惡意模塊文件中包含反彈shell的代碼。如圖3-5接著在腳本中提到的同一端口上啟動一個(gè)Netcat監(jiān)聽器,并繼續(xù)將/tmp目錄添加到Python路徑中,然后執(zhí)行hack.py文件以提升我們的訪問權(quán)限。
圖3-5惡意模塊文件里包含反彈shell的代碼
當(dāng)腳本運(yùn)行時(shí),我們可以看到一個(gè)會話連接到了我們的Netcat監(jiān)聽器。whoami和id命令表明了我們已經(jīng)成功地將權(quán)限從lele用戶提升到了root權(quán)限用戶,如圖3-6。
圖3-6已經(jīng)從普通訪問權(quán)限提權(quán)為root權(quán)限
在這篇文章中,我們通過人為的為Python庫的環(huán)境設(shè)置三個(gè)真實(shí)的場景,然后介紹了一些錯(cuò)誤的配置可能導(dǎo)致攻擊者將其訪問權(quán)限提升到root權(quán)限級別的方法。