前言
伺服器資訊包含類型 (IIS、Apache 或 Nginx) 與版本是一個很重要的資訊,當駭客想針對一個網頁應用程式下手時,必定先蒐集這些情報,下一步再看有沒有尚未修復的漏洞可以利用。
因此,若不想使這些資訊這麼透明,我們可以採取一些手段。這篇文章以 Apache 2 為例子隱藏伺服器資訊,不同類型的伺服器的概念都是一樣的。
環境
- Ubuntu 20.04 LTS
文章結構
此篇文章分為兩個段落
- 第一個段落說明如何從 HTTP 回應標頭 (HTTP Response Header) 來蒐集伺服器資訊,讓讀者心裡有個底為什麼接下來要這樣改。
- 第二個段落動手修改 HTTP 回應頭欄位中的 Server 欄位,這裡會採取兩個方式
- 使 Server 欄位只剩下
Apache
,版本與作業系統資訊不會顯示。 - 將 Server 欄位改為自己想要的輸出顯示,可以連
Apache
都不顯示。
- 使 Server 欄位只剩下
蒐集伺服器資訊
前置環境與作業
伺服器 IP 為 localhost,並在當前目錄下創建檔案 message
,內容如下
1 | HEAD / HTTP/1.1 |
16 進位形式
1 | 00000000: 4845 4144 202f 2048 5454 502f 312e 310d HEAD / HTTP/1.1. |
這裡特別附上該檔案的 16 進位形式,注意每一行後都有 \r\n
,也就是 0x0d0a
,最後一個空白行 \r\n
可別忘了!因為 linux 的換行只有 \n
,如何加上 \r
可以參考:[Echo] 在 Ubuntu 產生包含 \r 換行字元的檔案。
NetCat
NetCat 是一把網路瑞士刀,用它來進行網路相關操作是最好用且方便的
1 | user@pc:~$ nc localhost 80 < message |
資訊洩漏
從輸出結果可以準確知道使用的伺服器與運行版本資訊,甚至是作業系統的資訊,這些資訊都是當服務被發現有漏洞時,對我們不利的點!
因此,要如何隱藏這個資訊是我們該學的,雖然不能說隱藏起來就萬無一失,只是攻擊方在沒有這些情報下會比較難鎖定,若能拖延到補丁出現,受到攻擊的機率就被降低了!
修改標頭的 Server 欄位
修改的方法有兩種,各有利弊,這篇文章兩種方法都會記錄,但實際上需要哪一種還是要看個人
- 修改
conf
檔:用apt-get
安裝的Apache
只能用這個方法。優點是快速,缺點是最少還是會留下Apache
的字眼,讓使用者知道伺服器是 Apache。 - 修改原始碼再自行編譯:優點是可以完全改為自己想顯示的文字,缺點是因為要自行編譯,導致若要更新 Apache,還要再重新下載新的原始碼,重複一樣的步驟,無法像
apt-get
安裝的套件那樣直接更新。
修改 conf 檔
這裡使用的 Apache 版本為 2.4.41,不同版本所要修改的 conf
檔與其所在位置可能不同。
修改 security.conf
,其位置在 /etc/apache2/conf-available/security.conf
,將內容中 ServerTokens
所對應的值改為 Prod
1 | # ServerTokens |
重啟 Apache 服務,並且再做一次資訊蒐集,可以發現版本與 OS 的資訊已被隱蔽
1 | user@pc:~$ sudo /etc/init.d/apache2 restart |
這個方法最多只能只能遮蔽到這個程度,知道伺服器是 Apache,但版本與 OS 無法從此處得知。
修改原始碼自行編譯
Apache 編譯步驟 官網都有教學,但我們需要修改原始碼,所以還是會細講一下步驟。
下載原始碼
先到 Apache 官網 下載想要的版本 (選 tar.gz),解壓縮後進到資料。其中的 httpd-NN
就是下載的版本啦!
1 | user@pc:~$ gzip -d httpd-NN.tar.gz # 解 gz |
修改原始碼
開啟 httpd-NN/include/ap_release.h
找到 #define AP_SERVER_BASEPRODUCT "Apache"
,將 Apache
改為想要顯示在 Server 欄位的文字,僅需修改此處就可以往下個步驟
1 |
編譯原始碼
產出 Makefile
,在這步驟可能會遇到相依套件沒裝的問題 apr
、apr-util
與 prec
,所以先安裝相關套件,網路上很多都教下載這些套件的原碼再 compile,但我認為若可以使用 apt-get install
就盡量使用它,因為之後可以用 apt-get update/upgrade
來更新套件!管理上省事許多
1 | user@pc:~/Downloads/httpd-2.4.46 $ sudo apt-get install gcc libapr1 libapr1-dev libaprutil1 libaprutil1-dev libpcre3 libpcre3-dev |
若有看官網教學會看到 ./configure --prefix=PREFIX
,其中 PREFIX
是想安裝 Apache 的地方,不指定的話,就是安裝在預設路徑 /usr/local/apache2
,若沒特殊需求就安裝在預設路徑即可。
configure
執行成功後目錄下應該會有 Makefile
,現在就可以來編譯然後安裝啦。安裝完預設是關閉服務的,記得開啟嘿!
1 | user@pc:~/Downloads/httpd-2.4.46 $ make # 編譯 |
開啟服務後,檢查 Server 欄位是否被修改了,可以看到的確是剛修改的內容 Server field masked!
,但是版本與 OS 的資訊還在,要改的東西還沒完,請繼續下一步修改!
1 | user@pc:~$ nc localhost 80 < message |
修改設定檔
跟第一個修改方法很類似,要去修改一個 conf
檔,這裡為 /usr/local/apache2/conf/extra/httpd-default.conf
,將內容中 ServerTokens
所對應的值改為 Prod
1 | # ServerTokens |
還沒結束喔!還要修改一個 conf 檔,這裡為 /usr/local/apache2/conf/httpd.conf
,將內容中 #Include conf/extra/httpd-default.conf
前的井字號拿掉, 確保上一步的 httpd-default.conf
設定會被載入
1 | # Various default settings |
重啟服務,檢查 Server 欄位,可以看到的只剩下剛修改的內容 Server field masked!
完全無法從 Server 欄位得知這是什麼伺服器,更狠一點,也可以改為 Microsoft-IIS/10.0
來混淆視聽
1 | user@pc:~$ sudo /usr/local/apache2/bin/apachectl -k restart # 重啟服務 |