1 of 24

Bash資安管理手冊8~12章

產品部 / 上德 / 2023-8-31

DevOps讀書會

B L U E P L A N E T

2 of 24

Outline

O1

我的學習方式

O2

8~12章內容介紹

O3

自己的練習

2

B L U E P L A N E T

3 of 24

一、我的學習方式

3

B L U E P L A N E T

4 of 24

準備過程及心得

  • 這幾章程式碼過多且很多相關語法和背景知識並沒有說明
  • 卡在程式碼裡會導致閱讀進度容易停滯
  • 只擷取我需要的資訊,有興趣的需額外的查詢和練習

4

B L U E P L A N E T

5 of 24

練習環境

  • Windows – Git Bash
  • Linux

5

B L U E P L A N E T

6 of 24

Linux 執行 bash 檔案系統回覆 `comman not found`

  • Unix/Linux 執行 Shell script時,會fork一個新的子程序,子程序原則上不會繼承母程序的環境變數。直接執行命令時,環境變數會被預先代入,但是Script執行時環境變數就需要自己定義
  • 解法

1. Script需要 x 權限,使用 chomod 設定

2. 在指令的前面加上

3. 在指令的前面加上 `.` ,強制 Script 不 fork 子程序,繼承環境變數

6

chmod u+rx

/bin/bash

B L U E P L A N E T

7 of 24

一些奇怪的翻譯

  • 指令稿:Shell Script (?)
  • 日誌:log

7

B L U E P L A N E T

8 of 24

二、8~12章內容介紹

8

B L U E P L A N E T

9 of 24

第八章、日誌即時監控

  • 監看日誌

  • 再以管線導向給 `cut` 指令清理輸出

  • `--line-buffered`:讓 egrep 每遇到一次換行就會將結果送至標準輸出,如果沒有這個選項,就會出現暫存動作,輸出的結果就會一直等到暫存區已滿才會送交給cut處理

9

sudo tail -f /var/log/nginx/access.log | egrep 'HTTP/.*" 200'

sudo tail -f /var/log/nginx/access.log | egrep --line-buffered 'HTTP/.*" 200' | cut -d " " -f 4-7

B L U E P L A N E T

10 of 24

以日誌進行入侵偵測

  • **入侵指標 (indicators of compromise, IOCs)**:把符合已知可疑或惡意行為的任何日紀錄送出來,這些紀錄就是所謂的入侵指標。只要能做到這點,就等同於已經擁有一套輕量型入侵偵測系統 (IDS)
  • 建立一個內含 IOCs 相關正規表示式的檔案`ioc.txt`:
  • 比對符合的紀錄

  • 比對並輸出成檔案

  • 產生即時的長條圖… 太複雜了跳過 orz

10

\.\./

etc/passwd

etc/shadow

cmd\.exe

/bin/sh

/bin/bash

sudo tail -f /var/log/nginx/access.log | egrep -i -f ioc.txt

sudo tail -f /var/log/nginx/access.log | egrep --line-buffered -i -f ioc.txt | tee -a interesting.txt &

B L U E P L A N E T

11 of 24

第九章、工具:網路監看

  • 建立工具的需求(過於複雜所以內容跳過):
    1. 讀取一個檔案,檔案內含 IP 位址或主機名稱
    2. 針對檔案中的每一部主機進行通訊埠掃描,以判斷哪些通訊埠為開啟狀態
    3. 將通訊埠掃描結果存檔,並以掃描日期為檔案命名
    4. 再次執行同一指令稿,它會執行通訊埠掃描,然後將結果與先前儲存的通訊埠掃描結果互相比較,並將差異標示在畫面上
    5. 讓指令稿每天自動執行,如果發現變化,便送信給系統管理員

11

B L U E P L A N E T

12 of 24

在 Linux裡排定任務時間表 - Crontab

  • 列出所有的 cron檔案

  • 建立或編輯使用者的 cron檔案

  • Contab檔案寫法:前五個項目定義任務執行的時刻,第六項則是實際要執行的指令或檔案。
  • 例:讓 `autoscan.sh`每天早上 8:00 執行一次

12

crontab -l

crontab -e

0 8 * * * /home/paul/autoscan.sh

B L U E P L A N E T

13 of 24

第十章、工具:檔案系統監看

  • 建立工具的需求(過於複雜所以內容跳過):
    1. 記錄特定系統的每一個檔案路徑
    2. 替特定系統的每一個檔案產生 SHA-1 雜湊值
    3. 稍後重新執行工具,並列出任何曾經變更、被刪除,或是新增的檔案

13

B L U E P L A N E T

14 of 24

第十一章、惡意軟體分析

  • 分析方式有靜態和動態兩種:
    1. 靜態分析是分析程式碼本身,判斷是否有惡意行為的跡象存在
    2. 動態分析是執行程式碼並觀察其行為、以及對系統的影響,以便判斷其功能
  • 本章專注在靜態分析上

14

B L U E P L A N E T

15 of 24

常用指令

  • curl
  • vi
  • xxd

15

B L U E P L A N E T

16 of 24

第十二章、格式化報表

  • 範例 `tagit.sh`

  • 呼叫

16

printf '<%s>%s</%s>\n' "${1}" "${2}" "${1}"

$ /bin/bash tagit.sh div test

<div>test</div>

B L U E P L A N E T

17 of 24

三、自己的練習

17

B L U E P L A N E T

18 of 24

練習的自訂題目

  • 把前面範例的nginx log輸出,改寫成輸出成html並用table來呈現
  • 用crontab排程程式定期執行

18

B L U E P L A N E T

19 of 24

步驟一:將 nginx 的 log 輸出成文字檔

  • 延用前面範例寫好的 log 輸出

  • 我希望把它輸出成文字檔 `nginx-log.txt` ,所以在最後面這樣寫 `> nginx-log.txt`,接著發現它會卡住,所以最後面再加上 `&` 讓它不等待程序。
  • 改好後雖然不會卡住了,可是文字檔還是空的,判斷可能是緩存之類的問題,詢問 chatGPT加上 google 找到一個做法是使用 `stdbuf`讓它禁用緩存,修正後的指令:

19

sudo tail -f /var/log/nginx/access.log | egrep --line-buffered 'HTTP/.*" 200' | cut -d " " -f 4-7

sudo tail -f /var/log/nginx/access.log | egrep --line-buffered 'HTTP/.*" 200' | stdbuf -o0 cut -d " " -f 4-7 > nginx-log.txt &

B L U E P L A N E T

20 of 24

步驟二:把輸出指令寫成 .sh檔

  • 把這行寫到 .sh 檔內並呼叫

  • 可是系統回覆要求我輸入密碼,但輸入之後好像沒有作用,所以呼叫的指令再加上 `sudo` 就可以了
  • 但我希望他是可以不用輸入密碼的,所以改把檔案將當作參數傳入,內容改成:

  • 呼叫的指令就變成

20

/bin/bash ./get-nginx-log.sh

#!/bin/bash

log_file="$1"

output_file="$2"

sudo tail -f "$log_file" | egrep --line-buffered 'HTTP/.*" 200' | stdbuf -o0 cut -d " " -f 4-7 > "$output_file" &

/bin/bash ./get-nginx-log.sh /var/log/nginx/access.log nginx-log.txt

B L U E P L A N E T

21 of 24

步驟三:將文字檔輸出成 html表格

  • 使用書中範例給的範例程式
  • 呼叫指令

21

/bin/bash weblogfmt.sh nginx-log.txt > index.html

B L U E P L A N E T

22 of 24

步驟四:建立排程

  • 檢查目前的 crontab任務

  • 建立排程

  • 寫 cron檔案 - 每分鐘執行一次

22

crontab -l

crontab -e

*/1 * * * * /bin/bash /home/sdyou/practice/weblogfmt.sh /home/sdyou/practice/nginx-log.txt > /home/sdyou/practice/index.html

B L U E P L A N E T

23 of 24

步驟五:設定 nginx

  • 將 port 指向到網頁檔的資料夾位址
  • 成果:http://192.168.1.156:85/

23

B L U E P L A N E T

24 of 24

Thank you