Не знаю, как вы, а я что-то устал от загонов про сплайны , генетические алгоритмы и прочую муть. Для разнообразия я решил рассказать историю, которую мне удалось по крупицам восстановить с помощью одного популярного поисковика. Эта история о судьбе маленького скрипта, написанного в далеком 2007 году.
А если быть точнее, то началось все в мае 2006, и не со скрипта, а с утилиты на языке си. Это был маленький socks-сервер. Программу написал, а затем запостил на паре хакерских форумах некто под ником drmist.
Для всего перечисленного потребовалось всего лишь 500 строк кода. В узких кругах новость о выходе утилиты получила широкую огласку. А учитывая, что многие пользователи SSS неплохо разбирались в компах, наружу сразу полезли разные косяки.
Например, один из постоянных посетителей форума Античат с ником Zadoxlik обнаружил ошибку, связанную с обработкой сигналов в unix-системах:
Ктому же, если учитывать что в эксплоите идет коннект на 81ый порт, который на сервере, к которому идет коннект (сервер живого журнала), закрыт, то подпрограмма SocksPipe не будет запущена ни в текущем не в новом потоке!
И так!…. *Играют барабаны!* Сейчас все будут смеяться =)! Ни один античатовец (кроме ZaCo, который не считается) не нашел ответа к такой простой загадке!
Если бы кто-то порешил посмотреть у себя с чем валится бедный SSS, оказалось бы что он вылетает с… broken pipe! =) Дело в том что в Юникс системах есть небольшая подлость при работе с вводом/выводом в т.ч. в сокеты. Если попытаться послать данные TCP сокет, который был закрыт (!!!), приложение получит сигнал SIGPIPE и свалится.
Таким образом вся суть экслоита — послать данные и быстро-быстро разорвать соединение, так чтобы при следущем вызове send оно было уже закрыто, вот и вся история.
Универсальное решение — поставить обработчик сигнала SIGPIPE, для Linux и самых свежих FreeBSD можно просто при вызове send выставить флаг MSG_NOSIGNAL, правда, как уже говорил, SIGPEP может вылететь не только при работе с сокетом, так что лучше все же накумекать обработчик сигнала.
Также сообщалось, что во FreeBSD программа вылетает несколько раз в день безо всяких сообщений об ошибках. Что не удивительно, поскольку никаких сообщений об ошибках программа не умела выводить вообще.
Мораль: хорошие программы должны выводить сообщения об ошибках, притом чем информативнее эти сообщения, тем лучше.
О развитии событий на протяжении следующих 14 месяцев Google умалчивает 🙂 И вот на сцену выходит тот самый скрипт, о котором написано в заголовке поста:
Похоже, что долгое время скрипт не выкладывался в сети, передаваясь только из рук в руки. Во всяком случае, объявлений о продаже мне найти не удалось. Не знаю, что мешало выложить программу в паблик. Возможно, это были опасения, что толпы школоты пойдут поднимать свой соксы на хостах с бажным (по тем временам) phpBB. Хотя сейчас скрипт в паблике и, вроде, никто не умер. Кстати, именно потому что phpBB в свое время (как сейчас — не знаю) славился большим количество ошибок, я предпочитаю punBB .
Мораль: рано или поздно кто-нибудь запостит ваши приватные скрипты на каком-нибудь форуме. Чтобы этого не случилось, либо никому их не давайте, либо давайте за большие (100-1000$) деньги. В первом случае никто кроме вас не сможет их выложить, во втором — не захочет.
Так вот, оказалось, что скрипты на Perl одинаково хорошо работают во всех unix-системах. Не вылетает под Linux, значит во FreeBSD и Solaris тоже вряд ли упадет. К тому же, кода стало на 200 строк меньше.
Мораль: скриптовые языки — это хорошо.
Похоже, что в скором времени автор куда-то исчез и скрипт стало некому поддерживать. Спустя какое-то время некто hm2k выложил на sourceforge.net скрипт Simple Socks Server под лицензией BSD. Если заглянуть в код, оказывается, что все его отличие от Satanic Socks Server заключается в том, что номер порта, логин и пароль (в MD5) передаются скрипту в качестве аргументов, а не прописываются в коде.
Вообще по комментариям можно проследить всю родословную скрипта. Вот кусок из «нового» sss.pl:
А вот комментарии из «старого» sss.pl, прямо перед функцией, отвечающей за передачу данных из одного сокета в другой:
# written by CuTTer (cutter[at]real.xakep.ru)
Не знаю, как сейчас, а когда-то CuTTer был известен своими статьями в некоторых печатных изданиях.
Мораль: комментарии читать не только полезно, но и, порой, очень интересно.
В сети можно найти довольно много модификаций как sss.c так и sss.pl. Вообще я начал свое google-расследование благодаря недавнему посту в блоге kaimi.ru — человеку чем-то не понравился fork() и модуль Digest::MD5, в честь чего он решил сделать свою, довольно странную, модификацию скрипта. Почему странную? Во-первых, нехорошо светить пароль в списке процессов. Во-вторых, fork() — это хорошо . Потоки тоже не плохи, но переписывать ради них рабочий скрипт — это явно перебор.
Так или иначе, несмотря на то, что автор оригинального скрипта испарился три года назад, утилита продолжает развиваться. Быть может, кто-нибудь даже поддержку bind и udp скоро добавит 🙂
Мораль: OpenSource — это сила.
Вот такие интересные вещи (аж пять врезок с моралью!) можно узнать с помощью Google. А еще с его помощью мне удалось найти оригинальные sss.c и sss.pl плюс три модификации — одна на си, две на перле. Скачать все это добро можно здесь .