openvas9 原始碼編譯及模組解析
OPENVAS 9原始碼編譯
該文章為作者原創,轉載請宣告來源
作為業界最牛x的掃描器,通常來說安裝openvas都會直接在kali上使用或者apt來安裝,雖然安裝步驟算不上簡單,但是相比原始碼安裝肯定是方便了很多,後來openvas官方釋出了openvas的一個bug,這個bug的影響會導致一個半個小時掃完的ip需要三個小時才能掃完,而幾個月之後,官方也更新了新版本,我查看了一下那次提交,bug解決起來很簡單,只需要把一個while迴圈改成do while,然後加一個條件判斷,但是不僅需要重新編譯scanner,也要重新編譯庫檔案,因此乾脆就選擇了從頭編譯,也可以更加了解openvas各個模組。畢竟恐怕沒有掃描器比openvas原始碼編譯更復雜的了,但是同時在原始碼編譯的過程中也能對openvas各模組有更細緻的瞭解。
目錄
一.編譯檔案版本
我採用的版本如下:必要檔案: openvas-libraries-9.0.3 OPENVAS庫檔案 openvas-scanner-5.1.3 掃描代理 openvas-manager-7.0.3 排程中心 openvas-cli-1.4.4 命令列呼叫 gsa-7.0.3 前端Web UI redis-2.8.0 資料庫
其他檔案(自選): gvm-tools-1.4.1 openvas-smb-1.0.4 ospd-1.2.0
系統環境 ubuntu 16.04 server
以上檔案為2018.11.5日最新版(除了redis) 可以從openvas官網和github關注更新 https://community.greenbone.net/t/gvm-9-stable-initial-release-2017-03-07/211
二.安裝cmake
1. openvas原始碼安裝過程,必要檔案都是採用了cmake進行安裝,安裝之前先閱讀INSTALL檔案,安裝需要安裝的庫 2. 隨後建立build檔案後在build檔案中cmake .. 然後make && make install即可 3. 如果不想安裝在預設路徑下,在cmake之前export一下環境變數: export PKG_CONFIG_PATH=/your/location/lib/pkgconfig:$PKG_CONFIG_PATH 然後cmake語句中宣告新的路徑: cmake -DCMAKE_INSTALL_PREFIX=/path/to/your/installation ..
4. openvas原始碼編譯中對更改路徑有一些不友好,除了以上兩點之外,後續安裝過程依然存在兩個找不到路徑的問題,需要更改閱讀原始碼後對.c檔案進行操作(很坑),因此建議安裝到預設路徑(我的為/usr/local)
三.安裝openvas庫檔案
1. 解壓庫檔案:tar -zxvf openvas-libraries-9.0.3.tar.gz
2. 檢視INSTALL檔案:其中依賴的庫如下:
不過好在下邊給出了Debian的安裝庫安裝命令,雖然開頭提到了建議使用Debian,在其他系統可能會安裝失敗:
但是由於ubuntu的前身是debian,而且本人習慣於使用ubuntu,因此還是採用ubuntu進行原始碼安裝,安裝庫如下:
3. 隨後apt安裝doxygen,雖然這個庫不會影響整個openvas的編譯,但是會影響make doc,和make doc-full,也就是一些面向開發者的文件,如果沒有相應的需求可以忽略
4. 接下來就可以編譯openvas-lib了,依次執行以下命令: mkdir build cd build cmake .. make 構建庫檔案 make doc 構建基礎文件 make doc-full 構建更多面向開發者文件 make install 安裝所有構建的檔案 make rebuild_cache 重置cmake特徵 5. 進入預設路徑中的bin觀察剛剛建立的可執行檔案:其中openvas-nasl比較重要,它是用於執行單個外掛的程式。
以掃描vsftp的backdoor漏洞為例,呼叫命令為:openvas-nasl -X -t 192.168.140.115 -i /var/lib/openvas/plugins/ -k get_app/ports/cpe:/a:beasts:vsftpd=21 /var/lib/openvas/plugins/2011/gb_vsftpd_backdoor_07_2011.nasl 當然現在還沒有從官方地址拉取外掛庫,因此無法執行上述命令 6. 其他選項: 可以繼續閱讀INSTALL檔案,還包括配置選項,庫檔案靜態連結的構建等
四.安裝openvas-scanner 掃描代理
1. 解壓掃描代理:openvas-scanner-5.1.3.tar.gz 2. 檢視INSTALL 發現openvas-scanner也存在很多庫依賴,但是檔案中並沒有給出apt安裝的語句,因此直接嘗試cmake進行安裝 這裡注意如果庫檔案安裝在了非預設路徑下,要先export一下環境變數,讓scanner可以找到庫檔案 3. 編譯openvas-scanner mkdir build cd build cmake .. make 構建庫檔案 make doc 構建基礎文件 make doc-full 構建更多面向開發者文件 make install 安裝所有構建的檔案 make rebuild_cache 重置cmake特徵 4. 檢視openvas-scanner安裝生成的檔案:
其中openvassd為scanner的執行檔案,greenbone-nvt-sync為NVT(openvas中對漏洞外掛的簡稱)同步指令碼,兩個redis的配置檔案分別對應不同版本的redis的配置 5. 進行掃描器配置: 由於openvas的掃描器的配置會直接決定掃描結果的,因此我們最好對它進行一定的瞭解,然後按照需求進行配置,檢視的命令為openvassd -s,然後在$prefix/exc/openvassd.conf中進行配置即可 openvassd在/usr/local/sbin中 但是當前還無法執行openvassd,因此稍後再來觀察scanner的配置 6. 對漏洞外掛進行同步 這一步就簡述了,直接執行greenbone-nvt-sync就可以了,這個檔案在/usr/local/sbin中 這個時間較長,因為要同步50,000個外掛到本地 這一步的前提是系統中存在rsync,wget,curl至少一項
同步結束後檢視/usr/local/var/lib/openvas/plugins 資料夾即可看到剛剛同步的五萬個外掛 7. 安裝並同步redis資料庫 官方給出的redis版本號建議是支援2.4,建議使用2.6. 但是由於我當時下載的時候沒有注意到這個問題,因此使用的是2.8版本的,並沒有出現什麼異常,但是還是建議使用2.6版本。最好不要使用apt安裝,因為目前apt只有3.0.6版本,已經跨了一個大版本了
redis原始碼安裝比較簡單解壓後直接 make && make install 即可 安裝結束進入安裝路徑(預設為/usr/local/bin)執行redis-server來觀察是否執行成功,不過要在執行引數中加入&,表示靜默執行,否則退出介面後,redis-server也會跟著退出,然後netstat檢視一下預設的6379埠來檢視redis是否安裝成功:
安裝redis成功後還需要進行一步配置:
由於我使用的是2.8的redis,因此執行2.6的語句,在路徑前面加上openvas的安裝路徑: redis-server /usr/local/share/doc/openvas-scanner/example_redis_2_6.conf 我們可以繼續netstat一下6379埠,發現redis沒有繼續監聽了,我們netstat一下:
發現redis現在改為監聽38695埠了,這是為啥?檢視一下:
可以看到配置檔案中預設埠為0,因此應該是隨機選擇了一個埠進行監聽,但是作為服務端最好還是不要將openvas的redis資料庫埠對外開放(除非是有外部連線資料庫的需求),因此我們取消掉bind 127.0.0.1的註釋後重新執行redis:
可以看到,此時已經改為本地監聽了這樣redis不在網路上開放,因此也不需要對redis進行賬號密碼之類的額外配置 現在應該可以執行openvassd了,但是執行後報錯:
發現openvassd找不到庫檔案,因此我們需要更新動態庫快取檔案,在/etc/ld.so.conf.d目錄下建立openvas.conf檔案,將庫檔案的路徑寫入,寫入內容如下: /usr/local/lib 然後執行ldconfig命令,更新/etc/ld.so.cache檔案內容,如下圖:
最後我們就終於可以執行openvassd了!,然後加入-s檢視並瞭解一下掃描器的配置:
有關上述配置的說明可以使用 man openvassd 來檢視
隨後我們確定掃描器是否開啟: 網上有些教程會讓檢視9391埠是否開啟,因為scanner會監聽9391埠,但是我們這裡發現9391並沒有開啟,於是我們用netstat檢視一下服務是否開啟:
發現openvassd服務已經開啟了,並且接收到了兩個連線(manager還沒有安裝,也不知道是誰去連線了它) 原因是openvas9中已經將scanner的監聽改為本地監聽,不會監聽在網路,因此9391埠不會開啟,需要通過服務來判斷scanner是否安裝成功
五.安裝manager 排程中心
1. 解壓openvas-manager-7.0.3.tar.gz
2. 進入gvm-7.0.3目錄並檢視INSTALL檔案 依據檔案內容分別apt安裝包libsqlite3-dev和libpq-dev 接下來和之前相同,如果未安裝預設路徑要先export環境變數 mkdir build cd build cmake .. make 構建庫檔案 make doc 構建基礎文件 make doc-full 構建更多面向開發者文件 make install 安裝所有構建的檔案 make rebuild_cache 重置cmake特徵
執行的時候會發現make doc 和make doc-full會報錯
解決辦法是安裝兩個庫,直接使用apt安裝即可: sudo apt-get install xsltproc sudo apt-get install libgd-gd2-perl
安裝結束後執行openvasmd: openvasmd --listen=127.0.0.1
同樣,在openvas9中,manager不會監聽9390埠。
3. 生成證書 由於openvas manager使用TLS協議來進行tcp連線,因此需要生成一個證書,這個步驟在openvas9中給使用者提供了極大的方便,我們可以很容易的生成證書,只需要執行如下openvas-manage-certs(該檔案在/usr/local/bin/目錄下)即可,執行: openvas-manage-certs -a 會報錯:
仔細觀察一下manager編譯生成的安裝檔案,發現在/usr/local/sbin中存在兩個檔案: greenbone-scapdata-sync(這個命令需要的時間比較長,因為是從02年開始的資料) greenbone-certdata-sync
看名字應該分別是同步其他資料和證書資料的檔案,因此我們也先執行一下這兩個檔案 執行後依然報錯! 原因是我們還需要安裝一個叫certtool的東西,但是這個東西搜不到原始碼安裝包,我們只能這樣安裝: sudo apt install gnutls-bin 然後再檢測certtool是否安裝成功: certtool -h 現在我們可以安裝證書了: openvas-manage-certs -a
當然也可以手動生成證書
4. 構築資料庫: openvas-manager預設使用SQLite操作資料庫,因此需要先apt安裝sqlite3庫 初始化資料庫:首先要確保openvassd是開啟狀態,因為manager初始化資料庫時需要檢索scanner中的NVT資訊。隨後執行: openvasmd --rebuild ( 這個命令執行時間較長) 然後建立一個使用者: sudo openvasmd --create-user=admin --role=Admin 改密碼: sudo openvasmd --user=admin --new-password=admin admin/admin是openvas的預設密碼
5. 重新執行openvasmd 這裡最好殺掉原來的程序後重新執行, 直接openvasmd restart後出現了兩個openvasmd程序,未探究原因 6. 安裝nmap 因為openvas中主要會使用nmap進行資訊蒐集,因此nmap的安裝必不可少 apt install nmap
六.安裝GSA 前端web UI
1. 解壓gsa-7.0.3.tar.gz 2. 進入目錄gsa-7.0.3 同樣先觀察INSTALL檔案,需要下載如下安裝包: apt-get install libmicrohttpd-dev libxml2-dev libxslt1-dev 接下來用相同的方式進行安裝 mkdir build cd build cmake .. make 構建庫檔案 make doc 構建基礎文件 make doc-full 構建更多面向開發者文件 make install 安裝所有構建的檔案 make rebuild_cache 重置cmake特徵
3. 執行gsad 安裝結束後最需要關注的就是gsad(位於/usr/local/sbin) 直接執行gsad即可:
七.安裝openvas-cli 命令列呼叫
1. 下載安裝包
當前沒有在官網找到給出的最新安裝包,只有官方文件中的參考連結中給出了下載連結,版本為14.4
2. 解壓,安裝,步驟和其他安裝包相同 mkdir build cd build cmake .. make 構建庫檔案 make doc 構建基礎文件 make doc-full 構建更多面向開發者文件 make install 安裝所有構建的檔案 make rebuild_cache 重置cmake特徵
最後執行omp -?命令:
3. 重啟openvasmd 看起來已經安裝結束了,但是當我們執行檢視報告命令時:
提示獲取套接字失敗,經過對openvas的瞭解不難猜到這裡的套接字應該指的是manager的sock,我們netstat一下:
發現openvasmd服務正在執行,但是並沒有開啟套接字埠,雖然openvas9已經不需要openvasmd去監聽網路了,但是依然可以監聽本地埠,因此我們殺掉openvasmd程序後,重新起一個監聽本地埠的程序:
可以看到開啟了一個監聽127.0.0.1:9390埠的openvasmd的程序了 然後我們重新看一下omp檢視配置的返回結果:
沒有問題,至此,openvas-cli 命令列呼叫也安裝完畢
八.重啟後開啟openvas整個流程
可能看完了上述編譯文件之後會有點蒙,到底哪些步驟是配置的,哪些步驟是開啟服務的?畢竟openvas的編譯過程確實很複雜,因此我們重新整理一下重啟之後怎樣開啟openvas服務: 1. 開啟redis資料庫,注意一定要使用openvassd的配置檔案開啟: redis-server /usr/local/share/doc/openvas-scanner/example_redis_2_6.conf 2. 開啟openvas-scanner 掃描代理 openvassd 3. 開啟openvas-manager 排程中心 openvasmd 4. 開啟gsa 前端web ui(可選) gsad 5. 開啟openvasmd監聽埠(可選,僅omp需要) openvasmd --listen=127.0.0.1