返回文章列表

VirusTotalAPI惡意軟體檢測分析

本文介紹如何使用 VirusTotal API 進行惡意軟體檢測與分析,包含取得檢測報告、解析 JSON 格式的報告、使用 grep 和 bash 指令碼提取關鍵資訊,以及使用 awk 進行更進階的分析。此外,文章也涵蓋瞭如何使用 VirusTotal API 掃描檔案、URL、網域和 IP 位址,並搭配 tput

資安 Web 開發

VirusTotal API 提供了自動化檢測惡意軟體的機制,讓開發者能整合到各種應用程式中。透過 API,可以提交檔案或 URL 進行掃描,並取得多家防毒引擎的檢測結果,有效提升資安分析效率。取得的 JSON 格式報告,可以使用常見的命令列工具如 grep、awk,或是撰寫 bash 指令碼進行解析,提取所需的資訊,例如偵測率、病毒名稱等。除了單純的檢測外,VirusTotal API 也支援網域和 IP 位址的掃描,提供更全面的威脅情報。為了讓分析結果更易讀,可以利用 tput 控制終端機輸出格式,或將資料轉換成 HTML 格式,方便在瀏覽器中檢視和分享。更進一步,可以結合這些技術,開發一個動態更新的資訊儀錶板,即時監控系統安全狀態。

使用VirusTotal API分析惡意軟體檢測結果

VirusTotal提供了一個強大的API,用於檢測檔案是否為惡意軟體。透過這個API,開發者可以取得多個防毒引擎對特設定檔案的檢測結果。

取得VirusTotal檢測報告

要使用VirusTotal API,首先需要取得一個API金鑰。取得金鑰後,可以使用curl命令來查詢特設定檔案的檢測報告。以下是一個範例命令:

curl 'https://www.virustotal.com/vtapi/v2/file/report?apikey=你的API金鑰&resource=db349b97c37d22f5ea1d1841e3c89eb4&allinfo=false > WannaCry_VirusTotal.txt'

這個命令會將db349b97c37d22f5ea1d1841e3c89eb4這個檔案的檢測報告儲存到WannaCry_VirusTotal.txt檔案中。

內容解密:

  • curl是一個用於傳輸資料的命令列工具。
  • https://www.virustotal.com/vtapi/v2/file/report是VirusTotal的API端點,用於取得檔案的檢測報告。
  • apikey=你的API金鑰需要替換為你的實際API金鑰。
  • resource=db349b97c37d22f5ea1d1841e3c89eb4指定了要查詢的檔案的MD5雜湊值。
  • allinfo=false表示只傳回簡要的檢測結果。

分析JSON格式的檢測報告

VirusTotal傳回的檢測報告是JSON格式的,其中包含了多個防毒引擎的檢測結果。以下是一個範例JSON內容:

{"scans":
    {"Bkav":
        {"detected": true,
        "version": "1.3.0.9466",
        "result": "W32.WannaCrypLTE.Trojan",
        "update": "20180712"},
    "MicroWorld-eScan":
        {"detected": true,
        "version": "14.0.297.0",
        "result": "Trojan.Ransom.WannaCryptor.H",
        "update": "20180712"}
    }
}

內容解密:

  • scans是一個包含多個防毒引擎檢測結果的物件。
  • 每個防毒引擎(如BkavMicroWorld-eScan)都有自己的檢測結果,包括是否檢測到惡意軟體(detected)、引擎版本(version)、檢測結果(result)和更新日期(update)。

使用grep提取檢測結果

雖然JSON格式便於機器解析,但對於人類來說閱讀起來並不直觀。可以使用grep命令提取重要的資訊,如下所示:

$ grep -Po '{"detected": true.*?"result":.*?,' Calc_VirusTotal.txt

內容解密:

  • -P選項啟用Perl相容的正規表示式引擎。
  • -o選項表示只輸出匹配的部分。
  • 正規表示式{"detected": true.*?"result":.*?,"用於匹配包含detectedtrue的記錄,並提取到result欄位。

使用bash指令碼分析JSON報告

雖然使用grep可以提取部分資訊,但編寫一個bash指令碼可以更靈活地處理JSON報告。以下是一個範例指令碼(vtjson.sh):

#!/bin/bash -

RE='^.(.*)...\{.*detect..(.*),..vers.*result....(.*).,..update.*$'
FN="${1:-Calc_VirusTotal.txt}"
sed -e 's/{"scans": {/&\n /' -e 's/},/&\n/g' "$FN" |
while read ALINE
do
    if [[ $ALINE =~ $RE ]]
    then
        VIRUS="${BASH_REMATCH[1]}"
        FOUND="${BASH_REMATCH[2]}"
        RESLT="${BASH_REMATCH[3]}"
        if [[ $FOUND =~ .*true.* ]]
        then
            echo $VIRUS "- result:" $RESLT
        fi
    fi
done

內容解密:

  • RE定義了一個複雜的正規表示式,用於匹配包含特定欄位的行。
  • sed命令用於預處理JSON檔案,將重要的欄位分隔到單獨的行。
  • while迴圈逐行讀取處理後的檔案,並使用正規表示式匹配需要的資訊。
  • 如果某個防毒引擎檢測到惡意軟體(即detectedtrue),則輸出該引擎的名稱和檢測結果。

使用awk分析JSON報告

除了使用bash指令碼外,還可以使用awk來分析JSON報告。以下是一個範例awk指令碼:

# vtjson.awk
# 省略具體實作細節,請參考原Example 11-3

內容解密:

  • awk是一種強大的文書處理工具,可以根據欄位分隔符號來解析輸入資料。
  • 在這個範例中,awk指令碼可以用來解析JSON報告,並提取需要的資訊。

使用VirusTotal API進行惡意軟體掃描與分析

本章節將介紹如何使用VirusTotal API進行檔案、URL、網域和IP位址的掃描與分析,並提供相關的命令列工具和技巧,以提高資料的可讀性和呈現方式。

VirusTotal API簡介

VirusTotal是一個提供惡意軟體掃描和分析的平台,其API允許使用者上傳檔案、URL、網域和IP位址進行掃描,並取得相關的掃描報告。

使用VirusTotal API掃描檔案

要使用VirusTotal API掃描檔案,需要使用HTTP POST請求將檔案上傳至VirusTotal。以下是一個使用curl命令上傳檔案的範例:

curl --request POST \
  --url 'https://www.virustotal.com/vtapi/v2/file/scan' \
  --form 'apikey=replacewithapikey' \
  --form 'file=@/c/Windows/System32/calc.exe'

程式碼解析:

  1. --request POST:指定HTTP請求方法為POST。
  2. --url 'https://www.virustotal.com/vtapi/v2/file/scan':指定VirusTotal API的URL。
  3. --form 'apikey=replacewithapikey':提供VirusTotal API金鑰。
  4. --form 'file=@/c/Windows/System32/calc.exe':指定要上傳的檔案路徑。

內容解密:

  • 上傳檔案後,VirusTotal會傳回一個JSON物件,包含檔案的中繼資料,如掃描ID、SHA1、SHA256等。
  • 使用者可以使用掃描ID或雜湊值稍後檢索掃描報告。

使用VirusTotal API掃描URL、網域和IP位址

VirusTotal API也提供了掃描URL、網域和IP位址的功能。以下是一個使用curl命令檢索URL掃描報告的範例:

程式碼解析:

  1. https://www.virustotal.com/vtapi/v2/url/report:指定VirusTotal URL掃描報告API的URL。
  2. apikey=replacewithapikey:提供VirusTotal API金鑰。
  3. resource=www.example.com:指定要掃描的URL。
  4. allinfo=false:指定是否傳回所有資訊。
  5. scan=1:指定是否自動提交URL進行掃描。

內容解密:

  • 若URL不存在於資料函式庫中,VirusTotal會自動提交URL進行掃描。
  • 傳回的JSON物件包含URL的掃描報告。

使用awk處理JSON輸出

在取得VirusTotal的JSON輸出後,可以使用awk命令處理輸出結果。以下是一個範例指令碼(vtjson.awk):

NF == 9 {
  COMMA=","
  QUOTE="\""
  if ( $3 == "true" COMMA ) {
    VIRUS=$1
    gsub(QUOTE, "", VIRUS)
    RESLT=$7
    gsub(QUOTE, "", RESLT)
    gsub(COMMA, "", RESLT)
    print VIRUS, "- result:", RESLT
  }
}

程式碼解析:

  1. NF == 9:僅處理包含9個欄位的行。
  2. if ( $3 == "true" COMMA ):檢查第三個欄位是否為"true"。
  3. gsub(QUOTE, "", VIRUS):移除變數VIRUS中的引號。

內容解密:

  • 該指令碼用於解析VirusTotal的JSON輸出,並列印出惡意軟體偵測結果。

工作坊

  1. 建立一個正規表示式,以搜尋二進位檔案中單個可列印字元之間夾雜單個不可列印字元的模式。
  2. 搜尋二進位檔案中單個可列印字元的例項,並列印出未找到的字元。
  3. 編寫一個指令碼,以單一命令與VirusTotal API互動,使用選項-h檢查雜湊值、-f上傳檔案和-u檢查URL。

格式化與報告

為了最大限度地提高資料的有用性,必須以清晰易懂的格式呈現所收集和分析的資料。本章節將介紹如何使用tput命令控制終端機中的格式化輸出,以提高資料的可讀性。

終端機輸出格式控制與 HTML 格式化顯示

在處理終端機輸出或產生報表時,適當的格式化可以大大提升資訊的可讀性。本篇文章將介紹如何使用 tput 指令控制終端機輸出格式,以及如何利用 HTML 將資料轉換為更易閱讀的格式。

使用 tput 控制終端機輸出格式

tput 是一個用於控制終端機輸出的強大工具。它透過查詢 terminfo 資料函式庫來取得終端機的格式化程式碼,從而實作對遊標位置、行為等的控制。

常用的 tput 指令引數

  • clear:清除螢幕內容。
  • cols:輸出終端機的欄位數量。
  • cup <x> <y>:將遊標移動到指定的 <x><y> 座標。
  • lines:輸出終端機的行數。
  • rmcup:還原之前儲存的終端機佈局。
  • setab:設定終端機的背景顏色。
  • setaf:設定終端機的前景顏色。
  • smcup:儲存目前的終端機佈局並清除螢幕。

使用範例

# 清除螢幕
tput clear

# 將遊標移動到 (10, 20)
tput cup 10 20

# 設定前景色為紅色
tput setaf 1
echo "這是紅色的文字"

利用 HTML 格式化輸出

HTML(超文字標記語言)是一種用於在網頁上格式化和結構化內容的語言。將資料轉換為 HTML 格式,可以利用網頁瀏覽器的列印功能,方便地輸出格式化後的內容。

基本的 HTML 標籤

標籤用途
<html>HTML 檔案的最外層標籤
<body>包圍 HTML 檔案的主要內容
<h1>標題
<b>粗體文字
<ol>編號列表
<ul>專案符號列表

HTML 檔案範例

<html>
  <body>
    <h1>這是標題</h1>
    <b>這是粗體文字</b>
    <a href="http://www.example.com">這是連結</a>
    <ol>
      <li>列表專案 1</li>
      <li>列表專案 2</li>
    </ol>
    <table border="1">
      <tr>
        <td>第 1 行,第 1 列</td>
        <td>第 1 行,第 2 列</td>
      </tr>
      <tr>
        <td>第 2 行,第 1 列</td>
        <td>第 2 行,第 2 列</td>
      </tr>
    </table>
  </body>
</html>

簡化 HTML 輸出的指令碼

為了簡化 HTML 輸出,可以編寫一個簡單的指令碼或函式,用於將字串包裝在指定的 HTML 標籤中。

tagit.sh 範例指令碼

#!/bin/bash

# 將字串包裝在指定的 HTML 標籤中
printf '<%s>%s</%s>\n' "$1" "$2" "$1"

在指令碼中使用 tagit 函式格式化 Apache 日誌

#!/bin/bash

function tagit() {
  printf '<%s>%s</%s>\n' "$1" "$2" "$1"
}

echo "<html>"
echo "<body>"
echo "<h1>$1</h1>"
echo "<table border=1>"
echo "<tr>"
echo "<th>IP 地址</th>"
echo "<th>日期</th>"
echo "<th>請求 URL</th>"
echo "<th>狀態碼</th>"
echo "<th>大小</th>"
echo "<th>來源頁面</th>"
echo "<th>使用者代理</th>"
echo "</tr>"

while read f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12plus; do
  echo "<tr>"
  tagit "td" "$f1"
  tagit "td" "$f4 $f5"
  tagit "td" "$f6 $f7"
  tagit "td" "$f9"
  tagit "td" "$f10"
  tagit "td" "$f11"
  tagit "td" "$f12plus"
  echo "</tr>"
done < "$1"

echo "</table>"
echo "</body>"
echo "</html>"

建立資訊儀錶板

資訊儀錶板在需要顯示多個隨時間變化的資訊時非常有用。以下範例將展示如何建立一個顯示三個指令碼輸出並定期更新的儀錶板。

使用終端機圖形功能

該指令碼利用了終端機視窗的圖形功能。與其簡單地滾動資料頁面,此指令碼將從相同的起始位置重新繪製畫面,讓使用者可以在原地看到更新。

使用 tput 命令實作終端機獨立性

為了保持在不同終端機視窗程式中的可移植性,指令碼使用 tput 命令來取得特定終端機型別的圖形控制字元序列。

處理畫面重繪問題

由於畫面是「重繪」在原有的內容上,因此不能簡單地移動到畫面頂部並重新生成輸出。因為下一次迭代的輸出可能比前一次短或行數較少,若不清除舊資料,將導致舊資料殘留在畫面上。

解決方案:使用自定義函式處理輸出

為瞭解決上述問題,指令碼將所有輸出透過一個自定義函式處理,該函式在列印每一行輸出的同時,在行尾新增清除到行尾的字元序列,從而移除任何之前的輸出。此外,該函式還可以在每個命令的輸出末尾新增一行短劃線,以增強視覺效果。

範例程式碼:webdash.sh

#!/bin/bash -

# Rapid Cybersecurity Ops
# webdash.sh

# Description:
# Create an information dashboard

# 定義重要的常數字串
UPTOP=$(tput cup 0 0)
ERAS2EOL=$(tput el)
REV=$(tput rev) # 反白顯示
OFF=$(tput sgr0) # 一般重設
SMUL=$(tput smul) # 底線模式開啟
RMUL=$(tput rmul) # 底線模式關閉
COLUMNS=$(tput cols) # 終端機視窗寬度
printf -v DASHES '%*s' $COLUMNS '-'
DASHES=${DASHES// /-}

# prSection - 列印畫面的一個區段
# 從標準輸入讀取 $1 行資料
# 每行文字後面跟著清除到行尾的字元序列
# 區段結束時列印一行短劃線
function prSection ()
{
    local -i i
    for((i=0; i < ${1:-5}; i++))
    do
        read aline
        printf '%s%s\n' "$aline" "${ERAS2EOL}"
    done
    printf '%s%s\n%s' "$DASHES" "${ERAS2EOL}" "${ERAS2EOL}"
}

function cleanup()
{
    if [[ -n $BGPID ]]
    then
        kill %1
        rm -f $TMPFILE
    fi
} &> /dev/null

trap cleanup EXIT

# 啟動背景程式
TMPFILE=$(tempfile)
{ bash tailcount.sh $1 | bash livebar.sh > $TMPFILE ; } &
BGPID=$!

clear

while true
do
    printf '%s' "$UPTOP"
    # 標題:
    echo "${REV}Rapid Cyber Ops Ch. 12 -- Security Dashboard${OFF}" | prSection 1
    #
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
    {
        printf 'connections:%4d %s\n' $(netstat -an | grep 'ESTAB' | wc -l) "$(date)"
    } | prSection 1
    #
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
    tail -5 /var/log/syslog | cut -c 1-16,45-105 | prSection 5
    #
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
    { 
        echo "${SMUL}yymmdd${RMUL} ${SMUL}hhmmss${RMUL} ${SMUL}count of events${RMUL}"
        tail -8 $TMPFILE
    } | prSection 9
    sleep 3
done

內容解密:

  1. tput 命令的使用tput 命令用於取得特定終端機型別的控制字元序列,例如移動到畫面左上角 (cup 0 0)、清除到行尾 (el) 等,這些序列被儲存並在迴圈中重複使用,以提高效率。
  2. 建立一行短劃線的方法:使用 printf 命令配合 -v 選項和引數替換,產生一個與終端機寬度相同的短劃線字串。這是一種創意且略帶隱晦的方法。
  3. prSection 函式的作用:該函式負責列印畫面的一個區段。它從標準輸入讀取指定行數的資料,並在每行後面新增清除到行尾的字元序列,最後列印一行短劃線以分隔不同的區段。
  4. cleanup 函式和 trap 命令:當指令碼離開時,cleanup 函式會被呼叫,用於清理背景程式和暫存檔案。trap 命令用於捕捉離開訊號並執行 cleanup 函式。
  5. 主迴圈的邏輯:主迴圈不斷地重新整理畫面,顯示最新的資料。每個區段的資料來源不同,例如連線數、系統日誌等。迴圈中使用 sleep 3 控制更新頻率。