Cách Trojan Gustuff trên Android quét kem (tiền pháp định và tiền điện tử) khỏi tài khoản của bạn

Cách Trojan Gustuff trên Android quét kem (tiền pháp định và tiền điện tử) khỏi tài khoản của bạn

Mới hôm nọ Nhóm-IB báo cáo về hoạt động của Trojan Gustuff dành cho thiết bị di động Android. Nó hoạt động độc quyền trên thị trường quốc tế, tấn công khách hàng của 100 ngân hàng nước ngoài lớn nhất, người dùng 32 ví tiền điện tử di động, cũng như các tài nguyên thương mại điện tử lớn. Nhưng nhà phát triển Gustuff lại là một tên tội phạm mạng nói tiếng Nga với biệt danh Bestoffer. Cho đến gần đây, ông vẫn ca ngợi Trojan của mình là “một sản phẩm nghiêm túc dành cho những người có kiến ​​thức và kinh nghiệm”.

Chuyên gia phân tích mã độc tại Group-IB Ivan Pisarev trong nghiên cứu của mình, anh ấy nói chi tiết về cách thức hoạt động của Gustuff và mối nguy hiểm của nó.

Gustuff đang săn lùng ai?

Gustuff thuộc thế hệ phần mềm độc hại mới có chức năng hoàn toàn tự động. Theo nhà phát triển, Trojan đã trở thành phiên bản mới và cải tiến của phần mềm độc hại AndyBot, kể từ tháng 2017 năm 800, nó đã tấn công điện thoại Android và đánh cắp tiền thông qua các hình thức web lừa đảo giả dạng ứng dụng di động của các ngân hàng và hệ thống thanh toán quốc tế nổi tiếng. Bestoffer báo cáo rằng giá thuê Gustuff Bot là XNUMX USD mỗi tháng.

Phân tích mẫu Gustuff cho thấy Trojan có khả năng nhắm mục tiêu vào khách hàng sử dụng ứng dụng di động của các ngân hàng lớn nhất, như Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, cũng như ví tiền điện tử Ví Bitcoin, BitPay, Cryptopay, Coinbase, v.v.

Ban đầu được tạo ra như một Trojan ngân hàng cổ điển, trong phiên bản hiện tại Gustuff đã mở rộng đáng kể danh sách các mục tiêu tấn công tiềm năng. Ngoài các ứng dụng Android dành cho ngân hàng, công ty fintech và dịch vụ tiền điện tử, Gustuff còn nhắm đến người dùng các ứng dụng thị trường, cửa hàng trực tuyến, hệ thống thanh toán và tin nhắn tức thời. Đặc biệt, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut và những người khác.

Điểm vào: tính toán lây nhiễm hàng loạt

Gustuff được đặc trưng bởi vectơ thâm nhập “cổ điển” vào điện thoại thông minh Android thông qua gửi thư SMS có liên kết đến APK. Khi một thiết bị Android bị nhiễm Trojan theo lệnh của máy chủ, Gustuff có thể lây lan thêm qua cơ sở dữ liệu liên hệ của điện thoại bị nhiễm hoặc qua cơ sở dữ liệu máy chủ. Chức năng của Gustuff được thiết kế để lây nhiễm hàng loạt và tận dụng tối đa hoạt động kinh doanh của các nhà khai thác - nó có chức năng “tự động điền” duy nhất vào các ứng dụng ngân hàng di động hợp pháp và ví tiền điện tử, cho phép bạn tăng tốc và mở rộng quy mô trộm tiền.

Một nghiên cứu về Trojan cho thấy chức năng tự động điền được triển khai trong nó bằng Dịch vụ trợ năng, một dịch vụ dành cho người khuyết tật. Gustuff không phải là Trojan đầu tiên vượt qua thành công khả năng bảo vệ chống lại sự tương tác với các thành phần cửa sổ của các ứng dụng khác sử dụng dịch vụ Android này. Tuy nhiên, việc sử dụng Dịch vụ hỗ trợ tiếp cận kết hợp với phụ kiện ô tô vẫn còn khá hiếm.

Sau khi tải xuống điện thoại của nạn nhân, Gustuff, sử dụng Dịch vụ trợ năng, có thể tương tác với các thành phần cửa sổ của các ứng dụng khác (ngân hàng, tiền điện tử, cũng như các ứng dụng mua sắm trực tuyến, nhắn tin, v.v.), thực hiện các hành động cần thiết đối với những kẻ tấn công . Ví dụ: theo lệnh của máy chủ, Trojan có thể nhấn các nút và thay đổi giá trị của các trường văn bản trong ứng dụng ngân hàng. Việc sử dụng cơ chế Dịch vụ trợ năng cho phép Trojan vượt qua các cơ chế bảo mật được các ngân hàng sử dụng để chống lại các Trojan di động thế hệ trước, cũng như những thay đổi về chính sách bảo mật do Google triển khai trong các phiên bản mới của hệ điều hành Android. Do đó, Gustuff “biết cách” vô hiệu hóa tính năng bảo vệ của Google Protect: theo tác giả, chức năng này hoạt động trong 70% trường hợp.

Cách Trojan Gustuff trên Android quét kem (tiền pháp định và tiền điện tử) khỏi tài khoản của bạn

Gustuff cũng có thể hiển thị thông báo PUSH giả mạo với các biểu tượng của ứng dụng di động hợp pháp. Người dùng nhấp vào thông báo PUSH và thấy một cửa sổ lừa đảo được tải xuống từ máy chủ, nơi anh ta nhập dữ liệu thẻ ngân hàng hoặc ví tiền điện tử được yêu cầu. Trong một kịch bản Gustuff khác, ứng dụng hiển thị thông báo PUSH thay mặt cho nó sẽ được mở. Trong trường hợp này, phần mềm độc hại, theo lệnh từ máy chủ thông qua Dịch vụ trợ năng, có thể điền vào các trường biểu mẫu của ứng dụng ngân hàng để thực hiện giao dịch gian lận.

Chức năng của Gustuff cũng bao gồm gửi thông tin về thiết bị bị nhiễm đến máy chủ, khả năng đọc/gửi tin nhắn SMS, gửi yêu cầu USSD, khởi chạy SOCKS5 Proxy, theo liên kết, gửi tệp (bao gồm ảnh quét tài liệu, ảnh chụp màn hình, ảnh chụp) tới máy chủ. server, hãy đặt lại thiết bị về cài đặt gốc.

Phân tích phần mềm độc hại

Trước khi cài đặt một ứng dụng độc hại, hệ điều hành Android hiển thị cho người dùng một cửa sổ chứa danh sách các quyền mà Gustuff yêu cầu:

Cách Trojan Gustuff trên Android quét kem (tiền pháp định và tiền điện tử) khỏi tài khoản của bạn
Ứng dụng sẽ chỉ được cài đặt sau khi nhận được sự đồng ý của người dùng. Sau khi khởi chạy ứng dụng, Trojan sẽ hiển thị cho người dùng một cửa sổ:

Cách Trojan Gustuff trên Android quét kem (tiền pháp định và tiền điện tử) khỏi tài khoản của bạn
Sau đó nó sẽ loại bỏ biểu tượng của nó.

Theo tác giả, Gustuff được đóng gói bởi một nhà đóng gói của FTT. Sau khi khởi động, ứng dụng định kỳ liên lạc với máy chủ CnC để nhận lệnh. Một số tệp chúng tôi đã kiểm tra đã sử dụng địa chỉ IP làm máy chủ điều khiển 88.99.171 [.] 105 (sau đây chúng tôi sẽ ký hiệu nó là <%CnC%>).

Sau khi khởi chạy, chương trình bắt đầu gửi tin nhắn đến máy chủ http://<%CnC%>/api/v1/get.php.

Phản hồi dự kiến ​​sẽ là JSON ở định dạng sau:

{
    "results" : "OK",
    "command":{
        "id": "<%id%>",
        "command":"<%command%>",
        "timestamp":"<%Server Timestamp%>",
        "params":{
		<%Command parameters as JSON%>
        },
    },
}

Mỗi lần ứng dụng được truy cập, nó sẽ gửi thông tin về thiết bị bị nhiễm. Định dạng tin nhắn được hiển thị dưới đây. Điều đáng chú ý là các trường Full, thêm, ứng dụng и cho phép – tùy chọn và sẽ chỉ được gửi trong trường hợp có lệnh yêu cầu từ CnC.

{
    "info":
    {
        "info":
        {
            "cell":<%Sim operator name%>,
            "country":<%Country ISO%>,
            "imei":<%IMEI%>,
            "number":<%Phone number%>,
            "line1Number":<%Phone number%>,
            "advertisementId":<%ID%>
        },
        "state":
        {
            "admin":<%Has admin rights%>,
            "source":<%String%>,
            "needPermissions":<%Application needs permissions%>,
            "accesByName":<%Boolean%>,
            "accesByService":<%Boolean%>,
            "safetyNet":<%String%>,
            "defaultSmsApp":<%Default Sms Application%>,
            "isDefaultSmsApp":<%Current application is Default Sms Application%>,
            "dateTime":<%Current date time%>,
            "batteryLevel":<%Battery level%>
        },
        "socks":
        {
            "id":<%Proxy module ID%>,
            "enabled":<%Is enabled%>,
            "active":<%Is active%>
        },
        "version":
        {
            "versionName":<%Package Version Name%>,
            "versionCode":<%Package Version Code%>,
            "lastUpdateTime":<%Package Last Update Time%>,
            "tag":<%Tag, default value: "TAG"%>,
            "targetSdkVersion":<%Target Sdk Version%>,
            "buildConfigTimestamp":1541309066721
        },
    },
    "full":
    {
        "model":<%Device Model%>,
        "localeCountry":<%Country%>,
        "localeLang":<%Locale language%>,
        "accounts":<%JSON array, contains from "name" and "type" of accounts%>,
        "lockType":<%Type of lockscreen password%>
    },
    "extra":
    {
        "serial":<%Build serial number%>,
        "board":<%Build Board%>,
        "brand":<%Build Brand%>,
        "user":<%Build User%>,
        "device":<%Build Device%>,
        "display":<%Build Display%>,
        "id":<%Build ID%>,
        "manufacturer":<%Build manufacturer%>,
        "model":<%Build model%>,
        "product":<%Build product%>,
        "tags":<%Build tags%>,
        "type":<%Build type%>,
        "imei":<%imei%>,
        "imsi":<%imsi%>,
        "line1number":<%phonenumber%>,
        "iccid":<%Sim serial number%>,
        "mcc":<%Mobile country code of operator%>,
        "mnc":<%Mobile network codeof operator%>,
        "cellid":<%GSM-data%>,
        "lac":<%GSM-data%>,
        "androidid":<%Android Id%>,
        "ssid":<%Wi-Fi SSID%>
    },
    "apps":{<%List of installed applications%>},
    "permission":<%List of granted permissions%>
} 

Lưu trữ dữ liệu cấu hình

Gustuff lưu trữ thông tin vận hành quan trọng trong một tệp ưu tiên. Tên file cũng như tên các tham số trong đó là kết quả tính tổng MD5 từ chuỗi 15413090667214.6.1<%name%>Đâu <%name%> - tên-giá trị ban đầu. Giải thích Python về chức năng tạo tên:

 nameGenerator(input):
    output = md5("15413090667214.6.1" + input) 

Trong phần tiếp theo chúng ta sẽ biểu thị nó là nameGenerator(đầu vào).
Vì vậy, tên tập tin đầu tiên là: nameGenerator("API_SERVER_LIST"), nó chứa các giá trị có tên sau:

Tên biến Giá trị
nameGenerator("API_SERVER_LIST") Chứa danh sách các địa chỉ CnC ở dạng mảng.
nameGenerator("API_SERVER_URL") Chứa địa chỉ CnC.
nameGenerator("SMS_UPLOAD") Cờ được đặt theo mặc định. Nếu cờ được đặt, hãy gửi tin nhắn SMS tới CnC.
nameGenerator("SMS_ROOT_NUMBER") Số điện thoại mà tin nhắn SMS mà thiết bị bị nhiễm nhận được sẽ được gửi tới. Mặc định là null.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Cờ được xóa theo mặc định. Nếu được cài đặt, khi thiết bị bị nhiễm nhận được SMS, nó sẽ được gửi đến số gốc.
nameGenerator("DEFAULT_APP_SMS") Cờ được xóa theo mặc định. Nếu cờ này được đặt, ứng dụng sẽ xử lý tin nhắn SMS đến.
nameGenerator("DEFAULT_ADMIN") Cờ được xóa theo mặc định. Nếu cờ được đặt, ứng dụng có quyền quản trị viên.
nameGenerator("DEFAULT_ACCESSIBILITY") Cờ được xóa theo mặc định. Nếu cờ được đặt thì dịch vụ sử dụng Dịch vụ trợ năng đang chạy.
nameGenerator("APPS_CONFIG") Đối tượng JSON chứa danh sách các hành động phải được thực hiện khi kích hoạt một sự kiện Hỗ trợ tiếp cận liên kết với một ứng dụng cụ thể.
nameGenerator("APPS_INSTALLED") Lưu trữ danh sách các ứng dụng đã cài đặt trên thiết bị.
nameGenerator("IS_FIST_RUN") Cờ được đặt lại ở lần khởi động đầu tiên.
nameGenerator("UNIQUE_ID") Chứa một mã định danh duy nhất. Được tạo khi bot được khởi chạy lần đầu tiên.

Mô-đun xử lý lệnh từ máy chủ

Ứng dụng lưu trữ địa chỉ của máy chủ CnC dưới dạng một mảng được mã hóa bởi Cơ sở85 dòng. Danh sách máy chủ CnC có thể được thay đổi khi nhận được lệnh thích hợp, trong trường hợp đó, địa chỉ sẽ được lưu trữ trong tệp ưu tiên.

Để đáp lại yêu cầu, máy chủ sẽ gửi lệnh đến ứng dụng. Điều đáng chú ý là các lệnh và tham số được trình bày ở định dạng JSON. Ứng dụng có thể xử lý các lệnh sau:

Đội Описание
chuyển tiếpBắt đầu Bắt đầu gửi tin nhắn SMS mà thiết bị bị nhiễm nhận được tới máy chủ CnC.
về phía trướcDừng lại Dừng gửi tin nhắn SMS mà thiết bị bị nhiễm nhận được tới máy chủ CnC.
ussdRun Thực hiện yêu cầu USSD. Số mà bạn cần để thực hiện yêu cầu USSD nằm trong “số” trường JSON.
gửi tin nhắn Gửi một tin nhắn SMS (nếu cần, tin nhắn sẽ được chia thành nhiều phần). Là một tham số, lệnh lấy một đối tượng JSON chứa các trường “đến” - số đích và “nội dung” - nội dung của tin nhắn.
gửiSmsAb Gửi tin nhắn SMS (nếu cần, tin nhắn sẽ được chia thành nhiều phần) cho mọi người trong danh sách liên hệ của thiết bị bị nhiễm. Khoảng thời gian giữa các lần gửi tin nhắn là 10 giây. Nội dung của tin nhắn nằm trong "nội dung" của trường JSON
gửiSmsMass Gửi tin nhắn SMS (nếu cần, tin nhắn sẽ được chia thành nhiều phần) đến các địa chỉ liên hệ được chỉ định trong tham số lệnh. Khoảng thời gian giữa các lần gửi tin nhắn là 10 giây. Là một tham số, lệnh lấy một mảng JSON (trường “sms”), các phần tử trong đó chứa các trường “đến” - số đích và “nội dung” - nội dung của tin nhắn.
thay đổiMáy chủ Lệnh này có thể lấy một giá trị với khóa “url” làm tham số - sau đó bot sẽ thay đổi giá trị của nameGenerator(“SERVER_URL”) hoặc “array” - sau đó bot sẽ ghi mảng vào nameGenerator (“API_SERVER_LIST”) Do đó, ứng dụng sẽ thay đổi địa chỉ của máy chủ CnC.
số quản trị viên Lệnh được thiết kế để hoạt động với số gốc. Lệnh chấp nhận một đối tượng JSON với các tham số sau: “number” — thay đổi nameGenerator(“ROOT_NUMBER”) thành giá trị đã nhận, “resend” — thay đổi nameGenerator(“SMS_ROOT_NUMBER_RESEND”), “sendId” — gửi tới nameGenerator(“ROOT_NUMBER” ) ID duy nhất.
Cập nhật thông tin Gửi thông tin về thiết bị bị nhiễm đến máy chủ.
xóa dữ liệu Lệnh này nhằm mục đích xóa dữ liệu người dùng. Tùy thuộc vào tên ứng dụng được khởi chạy, dữ liệu sẽ bị xóa hoàn toàn khi khởi động lại thiết bị (người dùng chính) hoặc chỉ dữ liệu người dùng bị xóa (người dùng phụ).
vớBắt đầu Khởi chạy mô-đun Proxy. Hoạt động của mô-đun được mô tả trong một phần riêng biệt.
vớDừng lại Dừng mô-đun Proxy.
mở liên kết Theo liên kết. Liên kết nằm trong tham số JSON bên dưới khóa “url”. “android.intent.action.VIEW” được sử dụng để mở liên kết.
tải lênTất cảSms Gửi tất cả tin nhắn SMS mà thiết bị nhận được đến máy chủ.
tải lênTất cả ảnh Gửi hình ảnh từ thiết bị bị nhiễm tới một URL. URL xuất hiện dưới dạng tham số.
cập nhật dử liệu Gửi tệp tới URL từ thiết bị bị nhiễm. URL xuất hiện dưới dạng tham số.
tải lênSố điện thoại Gửi số điện thoại từ danh sách liên lạc của bạn đến máy chủ. Nếu một giá trị đối tượng JSON có khóa “ab” được nhận làm tham số thì ứng dụng sẽ nhận được danh sách liên hệ từ danh bạ điện thoại. Nếu một đối tượng JSON có khóa “sms” được nhận làm tham số, ứng dụng sẽ đọc danh sách liên hệ từ những người gửi tin nhắn SMS.
thay đổiLưu trữ Ứng dụng tải xuống tệp từ địa chỉ dưới dạng tham số bằng cách sử dụng phím “url”. Tệp đã tải xuống được lưu với tên “archive.zip”. Sau đó, ứng dụng sẽ giải nén tệp, tùy chọn sử dụng mật khẩu lưu trữ “b5jXh37gxgHBrZhQ4j3D”. Các tập tin đã giải nén sẽ được lưu trong thư mục [bộ nhớ ngoài]/hgps. Trong thư mục này, ứng dụng lưu trữ các trang web giả mạo (được mô tả bên dưới).
hành động Lệnh này được thiết kế để hoạt động với Action Service, được mô tả trong một phần riêng biệt.
thử nghiệm Không làm gì cả.
tải về Lệnh này nhằm mục đích tải xuống một tệp từ máy chủ từ xa và lưu nó vào thư mục “Tải xuống”. URL và tên tệp tương ứng là một tham số, các trường trong đối tượng tham số JSON: “url” và “tên tệp”.
tẩy Xóa một tập tin khỏi thư mục "Tải xuống". Tên tệp có tham số JSON với khóa “tên tệp”. Tên tệp tiêu chuẩn là “tmp.apk”.
thông báo Hiển thị thông báo với văn bản mô tả và tiêu đề được xác định bởi máy chủ quản lý.

Định dạng lệnh thông báo:

{
    "results" : "OK",
    "command":{
    "id": <%id%>,
    "command":"notification",
    "timestamp":<%Server Timestamp%>,
    "params":{
        "openApp":<%Open original app or not%>,
        "array":[
                      {"title":<%Title text%>,
                      "desc":<%Description text%>,
                      "app":<%Application name%>}
                   ]
                   },
        },
}

Thông báo được tạo bởi tệp đang được điều tra trông giống hệt với thông báo được tạo bởi ứng dụng được chỉ định trong trường ứng dụng. Nếu giá trị trường mở chương trình — Đúng, khi thông báo được mở, ứng dụng được chỉ định trong trường sẽ được khởi chạy ứng dụng. Nếu giá trị trường mở chương trình - Sai thì:

  • Một cửa sổ lừa đảo mở ra, nội dung trong đó được tải xuống từ thư mục <%bộ nhớ ngoài%>/hgps/<%filename%>
  • Một cửa sổ lừa đảo mở ra, nội dung trong đó được tải xuống từ máy chủ <%url%>?id=<%Bot id%>&app=<%Tên ứng dụng%>
  • Một cửa sổ lừa đảo mở ra, được ngụy trang dưới dạng Thẻ Google Play, có cơ hội nhập thông tin chi tiết về thẻ.

Ứng dụng sẽ gửi kết quả của bất kỳ lệnh nào tới <%CnC%>set_state.php dưới dạng một đối tượng JSON ở định dạng sau:

{
    "command":
    {
        "command":<%command%>,
        "id":<%command_id%>,
        "state":<%command_state%>
    }
    "id":<%bot_id%>
}

Hành độngDịch vụ
Danh sách các lệnh mà ứng dụng xử lý bao gồm hoạt động. Khi nhận được lệnh, mô-đun xử lý lệnh sẽ truy cập dịch vụ này để thực thi lệnh mở rộng. Dịch vụ chấp nhận đối tượng JSON làm tham số. Dịch vụ có thể thực thi các lệnh sau:

1. PARAMS_ACTION — khi nhận được lệnh như vậy, trước tiên dịch vụ sẽ nhận được từ tham số JSON giá trị của khóa Loại, có thể như sau:

  • thông tin dịch vụ – lệnh con lấy giá trị theo khóa từ tham số JSON bao gồmKhông quan trọng. Nếu cờ là True, ứng dụng sẽ đặt cờ FLAG_ISOLATED_PROCESS tới một dịch vụ bằng cách sử dụng Dịch vụ trợ năng. Bằng cách này, dịch vụ sẽ được khởi chạy theo một quy trình riêng biệt.
  • nguồn gốc — nhận và gửi đến máy chủ thông tin về cửa sổ hiện đang được lấy nét. Ứng dụng lấy thông tin bằng lớp AccessibilityNodeInfo.
  • quản trị viên — yêu cầu quyền quản trị viên.
  • chậm trễ - tạm dừng ActionsService trong số mili giây được chỉ định trong tham số cho khóa “dữ liệu”.
  • cửa sổ — gửi danh sách các cửa sổ hiển thị cho người dùng.
  • cài đặt, dựng lên — cài đặt ứng dụng trên thiết bị bị nhiễm. Tên của gói lưu trữ nằm trong khóa “fileName”. Bản thân kho lưu trữ nằm trong thư mục Tải xuống.
  • toàn cầu – lệnh phụ nhằm điều hướng từ cửa sổ hiện tại:
    • trên menu Cài đặt nhanh
    • cách đây
    • trang chủ
    • để thông báo
    • vào cửa sổ ứng dụng đã mở gần đây

  • phóng - chạy chương trình. Tên ứng dụng xuất hiện dưới dạng tham số theo khóa dữ liệu.
  • âm thanh - chuyển chế độ âm thanh sang im lặng.
  • mở khóa — bật đèn nền của màn hình và bàn phím ở độ sáng tối đa. Ứng dụng thực hiện hành động này bằng WakeLock, chỉ định chuỗi [Application lable]:INFO làm thẻ
  • quyềnOverlay — chức năng không được triển khai (phản hồi cho việc thực thi lệnh là {"message://Not support"} hoặc {"message://low sdk"})
  • cử chỉ — chức năng không được triển khai (phản hồi cho việc thực thi lệnh là {"message://Not support"} hoặc {"message://Low API"})
  • quyền — lệnh này là cần thiết để yêu cầu quyền cho ứng dụng. Tuy nhiên, chức năng truy vấn không được triển khai nên lệnh này vô nghĩa. Danh sách các quyền được yêu cầu có dạng mảng JSON với khóa “quyền”. Danh sách tiêu chuẩn:
    • ERIC.READ_PHONE_STATE
    • ERIC.READ_CONTACTS
    • android.permission.CALL_PHONE
    • android.permission.RECEIVE_SMS
    • android.permission.SEND_SMS
    • android.permission.READ_SMS
    • ERIC.READ_EXTERNAL_STORAGE
    • ERIC.WRITE_EXTERNAL_STORAGE

  • mở — hiển thị một cửa sổ lừa đảo. Tùy thuộc vào tham số đến từ máy chủ, ứng dụng có thể hiển thị các cửa sổ lừa đảo sau:
    • Hiển thị cửa sổ lừa đảo có nội dung được ghi vào một tệp trong thư mục <%thư mục bên ngoài%>/hgps/<%param_filename%>. Kết quả tương tác của người dùng với cửa sổ sẽ được gửi tới <%CnC%>/records.php
    • Hiển thị cửa sổ lừa đảo có nội dung được tải sẵn từ địa chỉ <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Kết quả tương tác của người dùng với cửa sổ sẽ được gửi tới <%CnC%>/records.php
    • Hiển thị cửa sổ lừa đảo được ngụy trang dưới dạng Thẻ Google Play.

  • tương tác — lệnh được thiết kế để tương tác với các thành phần cửa sổ của các ứng dụng khác bằng AcessibilityService. Một dịch vụ đặc biệt đã được triển khai trong chương trình để tương tác. Ứng dụng đang được điều tra có thể tương tác với windows:
    • Hiện đang hoạt động. Trong trường hợp này, tham số chứa id hoặc văn bản (tên) của đối tượng mà bạn cần tương tác.
    • Hiển thị cho người dùng tại thời điểm lệnh được thực thi. Ứng dụng chọn windows theo id.

    Đã nhận được đồ vật Khả năng truy cậpNodeInfo Đối với các thành phần cửa sổ quan tâm, ứng dụng, tùy thuộc vào các tham số, có thể thực hiện các hành động sau:

    • tiêu điểm - đặt tiêu điểm vào đối tượng.
    • bấm - bấm vào một đối tượng.
    • actionId - thực hiện một hành động bằng ID.
    • setText - thay đổi văn bản của một đối tượng. Có thể thay đổi văn bản theo hai cách: thực hiện một hành động ACTION_SET_TEXT (nếu phiên bản Android của thiết bị bị nhiễm nhỏ hơn hoặc bằng LOLLIPOP) hoặc bằng cách đặt một chuỗi vào bảng tạm và dán nó vào một đối tượng (đối với các phiên bản cũ hơn). Lệnh này có thể được sử dụng để thay đổi dữ liệu trong ứng dụng ngân hàng.

2. PARAMS_ACTIONS - giống như PARAMS_ACTION, chỉ có một mảng lệnh JSON xuất hiện.

Có vẻ như nhiều người sẽ quan tâm đến chức năng tương tác với các thành phần cửa sổ của một ứng dụng khác trông như thế nào. Đây là cách chức năng này được triển khai trong Gustuff:

boolean interactiveAction(List aiList, JSONObject action, JsonObject res) {
    int count = action.optInt("repeat", 1);
    Iterator aiListIterator = ((Iterable)aiList).iterator();
    int count = 0;
    while(aiListIterator.hasNext()) {
        Object ani = aiListIterator.next();
        if(1 <= count) {
            int index;
            for(index = 1; true; ++index) {
                if(action.has("focus")) {
                    if(((AccessibilityNodeInfo)ani).performAction(1)) {
                        ++count;
                    }
                }
                else if(action.has("click")) {
                    if(((AccessibilityNodeInfo)ani).performAction(16)) {
                        ++count;
                    }
                }
                else if(action.has("actionId")) {
                    if(((AccessibilityNodeInfo)ani).performAction(action.optInt("actionId"))) {
                        ++count;
                    }
                }
                else if(action.has("setText")) {
                    customHeader ch = CustomAccessibilityService.a;
                    Context context = this.getApplicationContext();
                    String text = action.optString("setText");
                    if(performSetTextAction(ch, context, ((AccessibilityNodeInfo)ani), text)) {
                        ++count;
                    }
                }
                if(index == count) {
                    break;
                }
            }
        }
        ((AccessibilityNodeInfo)ani).recycle();
    }
    res.addPropertyNumber("res", Integer.valueOf(count));
}

Chức năng thay thế văn bản:

boolean performSetTextAction(Context context, AccessibilityNodeInfo ani, String text) {
    boolean result;
    if(Build$VERSION.SDK_INT >= 21) {
        Bundle b = new Bundle();
        b.putCharSequence("ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE", ((CharSequence)text));
        result = ani.performAction(0x200000, b);  // ACTION_SET_TEXT
    }
    else {
        Object clipboard = context.getSystemService("clipboard");
        if(clipboard != null) {
        ((ClipboardManager)clipboard).setPrimaryClip(ClipData.newPlainText("autofill_pm", ((CharSequence)text)));
        result = ani.performAction(0x8000);  // ACTION_PASTE
        }
        else {
            result = false;
        }
    }
    return result;
}

Do đó, với cấu hình chính xác của máy chủ điều khiển, Gustuff có thể điền vào các trường văn bản trong ứng dụng ngân hàng và nhấp vào các nút cần thiết để hoàn tất giao dịch. Trojan thậm chí không cần đăng nhập vào ứng dụng - chỉ cần gửi lệnh hiển thị thông báo PUSH và sau đó mở ứng dụng ngân hàng đã cài đặt trước đó là đủ. Người dùng sẽ tự xác thực, sau đó Gustuff sẽ có thể đổ đầy xe.

Mô-đun xử lý tin nhắn SMS

Ứng dụng cài đặt trình xử lý sự kiện để thiết bị bị nhiễm chấp nhận tin nhắn SMS. Ứng dụng đang được nghiên cứu có thể nhận lệnh từ nhà điều hành, lệnh này có trong nội dung tin nhắn SMS. Các lệnh có dạng:

7!5=<%Lệnh được mã hóa Base64%>

Ứng dụng tìm kiếm chuỗi trong tất cả các tin nhắn SMS đến 7!5=, khi phát hiện một chuỗi, nó sẽ giải mã chuỗi đó từ Base64 ở offset 4 và thực thi lệnh. Các lệnh tương tự như lệnh của CnC. Kết quả thực hiện được gửi đến cùng số mà lệnh xuất phát. Định dạng phản hồi:

7*5=<%Mã hóa Base64 của “lệnh result_code”%>

Tùy chọn, ứng dụng có thể gửi tất cả tin nhắn đã nhận đến số Root. Để thực hiện việc này, số Root phải được chỉ định trong tệp ưu tiên và phải đặt cờ chuyển hướng thư. Một tin nhắn SMS được gửi đến số của kẻ tấn công theo định dạng:

<%Từ số%> - <%Thời gian, định dạng: dd/MM/yyyy HH:mm:ss%> <%SMS body%>

Ngoài ra, tùy chọn, ứng dụng có thể gửi tin nhắn tới CnC. Tin nhắn SMS được gửi đến máy chủ ở định dạng JSON:

{
    "id":<%BotID%>,
    "sms":
    {
        "text":<%SMS body%>,
        "number":<%From number%>,
        "date":<%Timestamp%>
    }
}

Nếu cờ được đặt nameGenerator("DEFAULT_APP_SMS") – ứng dụng dừng xử lý tin nhắn SMS và xóa danh sách tin nhắn đến.

Mô-đun proxy

Ứng dụng đang được nghiên cứu chứa mô-đun Backconnect Proxy (sau đây gọi là mô-đun Proxy), có một lớp riêng bao gồm các trường tĩnh có cấu hình. Dữ liệu cấu hình được lưu trữ trong mẫu ở dạng rõ ràng:

Cách Trojan Gustuff trên Android quét kem (tiền pháp định và tiền điện tử) khỏi tài khoản của bạn

Tất cả các hành động được thực hiện bởi mô-đun Proxy đều được đăng nhập vào tệp. Để thực hiện việc này, ứng dụng trong Bộ nhớ ngoài sẽ tạo một thư mục có tên là “logs” (trường ProxyConfigClass.logsDir trong lớp cấu hình), trong đó các tệp nhật ký được lưu trữ. Việc ghi nhật ký xảy ra trong các tệp có tên:

  1. main.txt – công việc của lớp có tên CommandServer được đăng nhập vào tệp này. Trong phần tiếp theo, việc ghi chuỗi str vào tệp này sẽ được ký hiệu là mainLog(str).
  2. session-<%id%>.txt — tệp này lưu dữ liệu nhật ký được liên kết với một phiên proxy cụ thể. Trong phần tiếp theo, việc ghi chuỗi str vào tệp này sẽ được ký hiệu là sessionLog (str).
  3. máy chủ.txt – tệp này được sử dụng để ghi lại tất cả dữ liệu được ghi vào các tệp được mô tả ở trên.

Định dạng dữ liệu nhật ký:

<%Date%> [Chủ đề[<%thread id%>], id[]]: chuỗi log

Các ngoại lệ xảy ra trong quá trình hoạt động của mô-đun Proxy cũng được ghi vào một tệp. Để thực hiện việc này, ứng dụng sẽ tạo một đối tượng JSON theo định dạng sau:

{
    "uncaughtException":<%short description of throwable%>
    "thread":<%thread%>
    "message":<%detail message of throwable%>
    "trace":        //Stack trace info
        [
            {
                "ClassName":
                "FileName":
                "LineNumber":
                "MethodName":
            },
            {
                "ClassName":
                "FileName":
                "LineNumber":
                "MethodName":
            }
        ]
}

Sau đó, nó chuyển đổi nó thành một biểu diễn chuỗi và ghi lại nó.

Mô-đun Proxy được khởi chạy sau khi nhận được lệnh tương ứng. Khi nhận được lệnh khởi chạy mô-đun Proxy, ứng dụng sẽ khởi động một dịch vụ có tên Dịch vụ chính, chịu trách nhiệm quản lý hoạt động của mô-đun Proxy - khởi động và dừng nó.

Các giai đoạn bắt đầu dịch vụ:

1. Bắt đầu bộ hẹn giờ chạy mỗi phút một lần và kiểm tra hoạt động của mô-đun Proxy. Nếu mô-đun không hoạt động, nó sẽ khởi động nó.
Ngoài ra khi sự kiện được kích hoạt android.net.conn.CONNECTIVITY_CHANGE Mô-đun Proxy được khởi chạy.

2. Ứng dụng tạo khóa đánh thức với tham số PARTIAL_WAKE_LOCK và bắt giữ anh ta. Điều này ngăn CPU của thiết bị chuyển sang chế độ ngủ.

3. Khởi chạy lớp xử lý lệnh của mô-đun Proxy, ghi nhật ký dòng đầu tiên mainLog("khởi động máy chủ") и

Máy chủ::start() máy chủ[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]

đâu proxy_cnc, command_port và proxy_port – các tham số thu được từ cấu hình máy chủ Proxy.

Lớp xử lý lệnh được gọi là LệnhKết nối. Ngay sau khi khởi động, thực hiện các hành động sau:

4. Kết nối với ProxyConfigClass.host: ProxyConfigClass.commandPort và gửi dữ liệu về thiết bị bị nhiễm ở định dạng JSON:

{
    "id":<%id%>,
    "imei":<%imei%>,
    "imsi":<%imsi%>,
    "model":<%model%>,
    "manufacturer":<%manufacturer%>,
    "androidVersion":<%androidVersion%>,
    "country":<%country%>,
    "partnerId":<%partnerId%>,
    "packageName":<%packageName%>,
    "networkType":<%networkType%>,
    "hasGsmSupport":<%hasGsmSupport%>,
    "simReady":<%simReady%>,
    "simCountry":<%simCountry%>,
    "networkOperator":<%networkOperator%>,
    "simOperator":<%simOperator%>,
    "version":<%version%>
}

Trong đó:

  • id – mã định danh, cố gắng lấy giá trị với trường “id” từ tệp Tùy chọn chia sẻ có tên “x”. Nếu không thể lấy được giá trị này, nó sẽ tạo ra một giá trị mới. Do đó, mô-đun Proxy có mã định danh riêng, được tạo tương tự như Bot ID.
  • imei - IMEI của thiết bị. Nếu xảy ra lỗi trong quá trình lấy giá trị, một thông báo văn bản lỗi sẽ được viết thay vì trường này.
  • imsi - Nhận dạng thuê bao di động quốc tế của thiết bị. Nếu xảy ra lỗi trong quá trình lấy giá trị, một thông báo văn bản lỗi sẽ được viết thay vì trường này.
  • model - Tên hiển thị của người dùng cuối cho sản phẩm cuối cùng.
  • nhà sản xuất - Nhà sản xuất sản phẩm/phần cứng (Build.MANUFACTURER).
  • androidVersion - một chuỗi có định dạng "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • quốc gia - vị trí hiện tại của thiết bị.
  • PartnerId là một chuỗi trống.
  • packageName – tên gói.
  • networkType - loại kết nối mạng hiện tại (ví dụ: “WIFI”, “MOBILE”). Trong trường hợp có lỗi, trả về null.
  • hasGsmSupport – đúng – nếu điện thoại hỗ trợ GSM, nếu không thì sai.
  • simReady – Trạng thái thẻ SIM.
  • simCountry - Mã quốc gia ISO (dựa trên nhà cung cấp thẻ SIM).
  • networkOperator - tên nhà điều hành. Nếu xảy ra lỗi trong quá trình lấy giá trị, một thông báo văn bản lỗi sẽ được viết thay vì trường này.
  • simOperator - Tên nhà cung cấp dịch vụ (SPN). Nếu xảy ra lỗi trong quá trình lấy giá trị, một thông báo văn bản lỗi sẽ được viết thay vì trường này.
  • phiên bản - trường này được lưu trữ trong lớp cấu hình; đối với các phiên bản thử nghiệm của bot, nó bằng “1.6”.

5. Chuyển sang chế độ chờ lệnh từ máy chủ. Các lệnh từ máy chủ có dạng:

  • 0 offset – lệnh
  • 1 phần bù - sessionId
  • 2 offset – chiều dài
  • 4 bù đắp - dữ liệu

Khi có lệnh đến, ứng dụng sẽ ghi lại:
mainLog("Tiêu đề { sessionId<%id%>], type[<%command%>], length[<%length%>] }")

Có thể thực hiện các lệnh sau từ máy chủ:

Họ tên Lệnh Ngày Mô tả
ID kết nối 0 ID kết nối Tạo kết nối mới
SLEEP 3 Thời gian Tạm dừng mô-đun Proxy
BÓNG BÀN 4 - Gửi tin nhắn PONG

Một tin nhắn PONG bao gồm 4 byte và trông như thế này: 0x04000000.

Khi nhận được lệnh ConnectionId (để tạo kết nối mới) LệnhKết nối tạo một thể hiện của một lớp Kết nối proxy.

  • Hai lớp tham gia proxy: Kết nối proxy и cuối. Khi tạo một lớp Kết nối proxy kết nối với địa chỉ ProxyConfigClass.host: ProxyConfigClass.proxyPort và truyền đối tượng JSON:

 {
    "id":<%connectionId%>
}

Để phản hồi, máy chủ sẽ gửi tin nhắn SOCKS5 chứa địa chỉ của máy chủ từ xa mà kết nối phải được thiết lập. Tương tác với máy chủ này xảy ra thông qua lớp cuối. Việc thiết lập kết nối có thể được biểu diễn dưới dạng sơ đồ như sau:

Cách Trojan Gustuff trên Android quét kem (tiền pháp định và tiền điện tử) khỏi tài khoản của bạn

Tương tác mạng

Để ngăn chặn việc phân tích lưu lượng truy cập của những kẻ đánh hơi mạng, sự tương tác giữa máy chủ CnC và ứng dụng có thể được bảo vệ bằng giao thức SSL. Tất cả dữ liệu được truyền từ và đến máy chủ đều được trình bày ở định dạng JSON. Ứng dụng thực hiện các yêu cầu sau trong quá trình hoạt động:

  • http://<%CnC%>/api/v1/set_state.php - kết quả của việc thực hiện lệnh.
  • http://<%CnC%>/api/v1/get.php - nhận lệnh.
  • http://<%CnC%>/api/v1/load_sms.php — tải xuống tin nhắn SMS từ thiết bị bị nhiễm virus.
  • http://<%CnC%>/api/v1/load_ab.php — tải lên danh sách liên hệ từ một thiết bị bị nhiễm virus.
  • http://<%CnC%>/api/v1/aevents.php – yêu cầu được thực hiện khi cập nhật các tham số nằm trong tệp ưu tiên.
  • http://<%CnC%>/api/v1/set_card.php — tải lên dữ liệu thu được bằng cách sử dụng cửa sổ lừa đảo giả mạo Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – tải lên dữ liệu nhật ký.
  • http://<%CnC%>/api/v1/records.php – tải lên dữ liệu thu được thông qua các cửa sổ lừa đảo.
  • http://<%CnC%>/api/v1/set_error.php - thông báo về một lỗi đã xảy ra.

Khuyến nghị

Để bảo vệ khách hàng của mình khỏi mối đe dọa từ Trojan di động, các công ty phải sử dụng các giải pháp toàn diện cho phép họ giám sát và ngăn chặn hoạt động độc hại mà không cần cài đặt phần mềm bổ sung trên thiết bị người dùng.

Để làm được điều này, các phương pháp phát hiện Trojan di động cần được tăng cường bằng các công nghệ phân tích hành vi của cả máy khách và chính ứng dụng. Việc bảo vệ cũng phải bao gồm chức năng nhận dạng thiết bị sử dụng công nghệ vân tay kỹ thuật số, giúp có thể hiểu được khi nào tài khoản đang được sử dụng từ một thiết bị không điển hình và đã rơi vào tay kẻ lừa đảo.

Một điểm quan trọng cơ bản là sự sẵn có của phân tích đa kênh, cho phép các công ty kiểm soát rủi ro phát sinh không chỉ trên Internet mà còn trên kênh di động, chẳng hạn như trong các ứng dụng ngân hàng di động, giao dịch với tiền điện tử và bất kỳ ứng dụng nào khác mà giao dịch có thể được thực hiện giao dịch tài chính.

Quy tắc an toàn cho người sử dụng:

  • không cài đặt ứng dụng cho thiết bị di động có hệ điều hành Android từ bất kỳ nguồn nào ngoài Google Play, đặc biệt chú ý đến các quyền mà ứng dụng yêu cầu;
  • thường xuyên cài đặt các bản cập nhật hệ điều hành Android;
  • chú ý đến phần mở rộng của các tệp đã tải xuống;
  • không truy cập các tài nguyên đáng ngờ;
  • Không nhấp vào liên kết nhận được trong tin nhắn SMS.

Diễn viên chính Semyon Rogacheva, chuyên gia cấp dưới về nghiên cứu phần mềm độc hại tại Phòng thí nghiệm pháp y máy tính Group-IB.

Nguồn: www.habr.com

Thêm một lời nhận xét