0%

[Apache] 修改 HTTP 標頭中的 Server 欄位

前言

伺服器資訊包含類型 (IIS、Apache 或 Nginx) 與版本是一個很重要的資訊,當駭客想針對一個網頁應用程式下手時,必定先蒐集這些情報,下一步再看有沒有尚未修復的漏洞可以利用。

因此,若不想使這些資訊這麼透明,我們可以採取一些手段。這篇文章以 Apache 2 為例子隱藏伺服器資訊,不同類型的伺服器的概念都是一樣的。

環境

  • Ubuntu 20.04 LTS

文章結構

此篇文章分為兩個段落

  1. 第一個段落說明如何從 HTTP 回應標頭 (HTTP Response Header) 來蒐集伺服器資訊,讓讀者心裡有個底為什麼接下來要這樣改。
  2. 第二個段落動手修改 HTTP 回應頭欄位中的 Server 欄位,這裡會採取兩個方式
    • 使 Server 欄位只剩下 Apache,版本與作業系統資訊不會顯示。
    • 將 Server 欄位改為自己想要的輸出顯示,可以連 Apache 都不顯示。

蒐集伺服器資訊

前置環境與作業

伺服器 IP 為 localhost,並在當前目錄下創建檔案 message,內容如下

1
2
3
HEAD / HTTP/1.1
Host: localhost

16 進位形式

1
2
3
00000000: 4845 4144 202f 2048 5454 502f 312e 310d  HEAD / HTTP/1.1.
00000010: 0a48 6f73 743a 206c 6f63 616c 686f 7374 .Host: localhost
00000020: 0d0a 0d0a ....

這裡特別附上該檔案的 16 進位形式,注意每一行後都有 \r\n,也就是 0x0d0a,最後一個空白行 \r\n 可別忘了!因為 linux 的換行只有 \n,如何加上 \r 可以參考:[Echo] 在 Ubuntu 產生包含 \r 換行字元的檔案

NetCat

NetCat 是一把網路瑞士刀,用它來進行網路相關操作是最好用且方便的

1
2
3
4
5
6
7
8
9
10
user@pc:~$ nc localhost 80 < message
HTTP/1.1 200 OK
Date: Thu, 03 Sep 2020 01:37:03 GMT
Server: Apache/2.4.41 (Ubuntu)
Last-Modified: Thu, 03 Sep 2020 01:24:28 GMT
ETag: "2aa6-5ae5e9d0acf52"
Accept-Ranges: bytes
Content-Length: 10918
Vary: Accept-Encoding
Content-Type: text/html

資訊洩漏

從輸出結果可以準確知道使用的伺服器與運行版本資訊,甚至是作業系統的資訊,這些資訊都是當服務被發現有漏洞時,對我們不利的點!

因此,要如何隱藏這個資訊是我們該學的,雖然不能說隱藏起來就萬無一失,只是攻擊方在沒有這些情報下會比較難鎖定,若能拖延到補丁出現,受到攻擊的機率就被降低了!

修改標頭的 Server 欄位

修改的方法有兩種,各有利弊,這篇文章兩種方法都會記錄,但實際上需要哪一種還是要看個人

  1. 修改 conf 檔:用 apt-get 安裝的 Apache 只能用這個方法。優點是快速,缺點是最少還是會留下 Apache 的字眼,讓使用者知道伺服器是 Apache。
  2. 修改原始碼再自行編譯:優點是可以完全改為自己想顯示的文字,缺點是因為要自行編譯,導致若要更新 Apache,還要再重新下載新的原始碼,重複一樣的步驟,無法像 apt-get 安裝的套件那樣直接更新。

修改 conf 檔

這裡使用的 Apache 版本為 2.4.41,不同版本所要修改的 conf 檔與其所在位置可能不同。

修改 security.conf,其位置在 /etc/apache2/conf-available/security.conf,將內容中 ServerTokens 所對應的值改為 Prod

1
2
3
4
5
6
7
8
9
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of: Full | OS | Minimal | Minor | Major | Prod
# where Full conveys the most information, and Prod the least.
#ServerTokens Minimal
ServerTokens Prod
#ServerTokens Full

重啟 Apache 服務,並且再做一次資訊蒐集,可以發現版本與 OS 的資訊已被隱蔽

1
2
3
4
5
6
7
8
9
10
11
user@pc:~$ sudo /etc/init.d/apache2 restart
user@pc:~$ nc localhost 80 < message
HTTP/1.1 200 OK
Date: Thu, 03 Sep 2020 07:50:50 GMT
Server: Apache
Last-Modified: Thu, 03 Sep 2020 07:25:19 GMT
ETag: "2aa6-5ae63a79037be"
Accept-Ranges: bytes
Content-Length: 10918
Vary: Accept-Encoding
Content-Type: text/html

這個方法最多只能只能遮蔽到這個程度,知道伺服器是 Apache,但版本與 OS 無法從此處得知。

修改原始碼自行編譯

Apache 編譯步驟 官網都有教學,但我們需要修改原始碼,所以還是會細講一下步驟。

下載原始碼

先到 Apache 官網 下載想要的版本 (選 tar.gz),解壓縮後進到資料。其中的 httpd-NN 就是下載的版本啦!

1
2
3
user@pc:~$ gzip -d httpd-NN.tar.gz # 解 gz
user@pc:~$ tar xvf httpd-NN.tar # 解 tar
user@pc:~$ cd httpd-NN # 進到目錄下

修改原始碼

開啟 httpd-NN/include/ap_release.h 找到 #define AP_SERVER_BASEPRODUCT "Apache",將 Apache 改為想要顯示在 Server 欄位的文字,僅需修改此處就可以往下個步驟

1
#define AP_SERVER_BASEPRODUCT "Server field masked!"

編譯原始碼

產出 Makefile,在這步驟可能會遇到相依套件沒裝的問題 aprapr-utilprec,所以先安裝相關套件,網路上很多都教下載這些套件的原碼再 compile,但我認為若可以使用 apt-get install 就盡量使用它,因為之後可以用 apt-get update/upgrade 來更新套件!管理上省事許多

1
2
user@pc:~/Downloads/httpd-2.4.46 $ sudo apt-get install gcc libapr1 libapr1-dev libaprutil1 libaprutil1-dev libpcre3 libpcre3-dev
user@pc:~/Downloads/httpd-2.4.46 $ ./configure

若有看官網教學會看到 ./configure --prefix=PREFIX,其中 PREFIX 是想安裝 Apache 的地方,不指定的話,就是安裝在預設路徑 /usr/local/apache2,若沒特殊需求就安裝在預設路徑即可。

configure 執行成功後目錄下應該會有 Makefile,現在就可以來編譯然後安裝啦。安裝完預設是關閉服務的,記得開啟嘿!

1
2
3
user@pc:~/Downloads/httpd-2.4.46 $ make                                           # 編譯
user@pc:~/Downloads/httpd-2.4.46 $ sudo make install # 安裝
user@pc:~/Downloads/httpd-2.4.46 $ sudo /usr/local/apache2/bin/apachectl -k start # 開啟服務

開啟服務後,檢查 Server 欄位是否被修改了,可以看到的確是剛修改的內容 Server field masked!,但是版本與 OS 的資訊還在,要改的東西還沒完,請繼續下一步修改!

1
2
3
4
5
6
7
8
9
user@pc:~$ nc localhost 80 < message
HTTP/1.1 200 OK
Date: Thu, 03 Sep 2020 09:29:14 GMT
Server: Server field masked!/2.4.46 (Unix)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html

修改設定檔

跟第一個修改方法很類似,要去修改一個 conf 檔,這裡為 /usr/local/apache2/conf/extra/httpd-default.conf,將內容中 ServerTokens 所對應的值改為 Prod

1
2
3
4
5
6
7
8
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of: Full | OS | Minor | Minimal | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Prod

還沒結束喔!還要修改一個 conf 檔,這裡為 /usr/local/apache2/conf/httpd.conf,將內容中 #Include conf/extra/httpd-default.conf 前的井字號拿掉, 確保上一步的 httpd-default.conf 設定會被載入

1
2
# Various default settings
Include conf/extra/httpd-default.conf

重啟服務,檢查 Server 欄位,可以看到的只剩下剛修改的內容 Server field masked! 完全無法從 Server 欄位得知這是什麼伺服器,更狠一點,也可以改為 Microsoft-IIS/10.0 來混淆視聽

1
2
3
4
5
6
7
8
9
10
user@pc:~$ sudo /usr/local/apache2/bin/apachectl -k restart # 重啟服務
user@pc:~$ nc localhost 80 < message
HTTP/1.1 200 OK
Date: Thu, 03 Sep 2020 09:49:28 GMT
Server: Server field masked!
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html
很高興能在這裡幫助到您,歡迎登入 Liker 為我鼓掌 5 次,或者成為我的讚賞公民,鼓勵我繼續創造優質文章。
以最優質的內容回應您的鼓勵