Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Избранное (https://forum.antichat.xyz/forumdisplay.php?f=89)
-   -   SOCKS на PHP (https://forum.antichat.xyz/showthread.php?t=177147)

ShAnKaR 28.12.2009 03:25

SOCKS на PHP
 
Вложений: 1
socks на php, в первую очередь планировался как вариант обхода фаервола, когда открыт только 80 порт а необходим доступ к сервисам на других портах. удобно использовать в комлекте с соксификаторами такими как например proxychains.

в комплект входят два скрипта :
client.pl клиент запускается у себя,примерно так
./client.pl 127.0.0.1:1081 http://localhost/server.php
# используются стандартные библиотеки входящие по умолчанию в установочный пакет perl
# IO::Socket::INET, MIME::Base64, Compress::Zlib

server.php - загружается на сервер
#для успешной работы требуется:
#php5, папка доступная для записи ( строчка $IPC_TMPDIR='/tmp/'; ), Registered Stream Socket Transports - unix

клиентский скрипт работает как sock5, пересылая трафик на загруженный серверный скрипт.
запуская с дополнительным третьим аргументом выводится дебаг информация.

написал по своему практически, использовав :
http://sourceforge.net/projects/ssspl/
http://http-tunnel.sourceforge.net/

поделитесь пожалуйста что у кого не работает/обругайте код.

Nightmarе 28.12.2009 15:43

Во! Теперь пэрл без проблемм работает... перл, но не сам сокс.
Во первых мне не совсем понятно, зачем указывать sosk_ip:socks_port, разве не одним локальным портом можно воспользоваться?

Вот у меня такое выходит, запускаю с параметрами:
client.pl 127.0.0.1:51103 http://shinobi.net.ru/servak.php -d
В FireFox выставляю сокс 5, и локальный порт 51103, захожу на сайты - не пашет ни один, зато в консоли наблюдаю такое:
Код:

127.0.0.1:51103 => shinobi.org.ru:80127.0.0.1:51103 => advisordb.wmtransfer.com:
443127.0.0.1:51103 => shinobi.org.ru:80127.0.0.1:51103 => advisordb.wmtransfer.c
om:443127.0.0.1:51103 => shinobi.org.ru:80127.0.0.1:51103 => advisordb.wmtransfe
r.com:443127.0.0.1:51103 => ya.ru:80127.0.0.1:51103 => bar-navig.yandex.ru:80127
.0.0.1:51103 => bar.blogs.yandex.net:80 STATUS: OK
client DISCONNECTED
127.0.0.1:51103 => shinobi.org.ru:80127.0.0.1:51103 => advisordb.wmtransfer.com:
443

То есть заходы на все эти сайты есть, однако FF выдаёт ошибку "Время ожидания соединения истекло".

Да, на сервере рядом со скриптом лежит папка tmp с правами на запись.

ShAnKaR 29.12.2009 13:40

Цитата:

Сообщение от Nightmarе
Во первых мне не совсем понятно, зачем указывать sosk_ip:socks_port, разве не одним локальным портом можно воспользоваться?

да не одним локальным ip.

на счет проблемы- может не резольвятся хосты на серере?( как вариант обратится к http://77.88.21.8/ ) или фаервол исходящие не пускает? я попробую тоже в свою очередь в разных условиях потестить.

Nightmarе 29.12.2009 18:47

Не пашут и IP адреса вместо обычных :(

Вместо sosk_ip вписывал как 127.0.0.1 так и свой домашний IP, всё равно ничего не пашет ;(
Или правильно ли я понимаю, php скрипт сам к тебе коннектится на этот порт чтоли? (Тогда в случае с NAT будет облом)

ShAnKaR 29.12.2009 20:19

Цитата:

Сообщение от Nightmarе
Или правильно ли я понимаю, php скрипт сам к тебе коннектится на этот порт чтоли? (Тогда в случае с NAT будет облом)

нет не конектится ) это данные где сокс поднимается только.

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

на счет xor-шифрование - скорость уменьшается конечно значительно, но зато хоть какая-никакая защита от снифа.

$Atlet$ 29.12.2009 21:28

Тоже не работает, ОС Windows.
Код:

127.0.0.1:51103 => 78.47.**.**:80Read error  at C:\sss.pl line 106.
127.0.0.1:51103 => 78.47.**.**:80Read error  at C:\sss.pl line 106.


ShAnKaR 02.01.2010 19:52

Цитата:

Сообщение от $Atlet$
Тоже не работает, ОС Windows.
Код:

127.0.0.1:51103 => 78.47.**.**:80Read error  at C:\sss.pl line 106.
127.0.0.1:51103 => 78.47.**.**:80Read error  at C:\sss.pl line 106.


возможно у тебя папка /tmp/ не доступна для записи - к примеру если включен open_basedir, обновил скрипты, добавил проверку.

Nightmarе 02.01.2010 20:07

Протестировал.
Сначало при попытке зайти на какой нибудь сайт была белая страница, но и ошибку в консоли выдавало, что директория tmp не доступна на запись (хотя доступна).
Ладно, в php скрипте я указал полный путь до папки tmp и ошибка с записью пропала, но теперь выводит стандартную ошибку:
"Время ожидания соединения истекло"
Лог из консоли прилогаю в текстовом файле:
http://www.sendspace.com/file/iqsoul
Пользовался браузером FireFox ставя пятый сокс.

PS: Народ, почему никто не тестит и не пишет о результатах?

$Atlet$ 05.01.2010 00:11

Все заработало, только некоторые сайты (например http://www.archive.org/) не открываются, браузер(FireFox) выдаёт ошибку:
Код:

Ошибка в типе содержимого

Страница, которую вы пытаетесь просмотреть, не может быть показана, так как она использует неверную или неподдерживаемую форму компрессии.


ShAnKaR 05.01.2010 19:05

Цитата:

Сообщение от $Atlet$
Все заработало, только некоторые сайты (например http://www.archive.org/) не открываются, браузер(FireFox) выдаёт ошибку:
Код:

Ошибка в типе содержимого

Страница, которую вы пытаетесь просмотреть, не может быть показана, так как она использует неверную или неподдерживаемую форму компрессии.


у меня норм этот сайт, можно логи посмотреть что скрипт выдает?

Nightmarе 06.01.2010 00:11

А у меня в чём может быть приблизительно причина?
Файрволы я отключал, но самое интересное, это то, что в консоли постоянно мелькают сообщения типа 200 OK, то есть я так понимаю, перловый скрипт, всё-таки получает информацию от скрипта, но почему-то до браузера она не доходит.
Пробовал использовать и FreeCap, запуская из под него все браузеры и прочий софт - безрезультатно ;(

warwar 06.01.2010 01:30

Спасибо за скрипты, очень медленно обрабатывает запросы, гугл открывался секунд 5...

ShAnKaR 07.01.2010 00:00

Цитата:

Сообщение от Nightmarе
А у меня в чём может быть приблизительно причина?
Файрволы я отключал, но самое интересное, это то, что в консоли постоянно мелькают сообщения типа 200 OK, то есть я так понимаю, перловый скрипт, всё-таки получает информацию от скрипта, но почему-то до браузера она не доходит.
Пробовал использовать и FreeCap, запуская из под него все браузеры и прочий софт - безрезультатно ;(

у тебя проблема как мне кажется в том что на сервере фаервол не пускает исходящие, а на твоем компе фаер не играет роли.
попробуй там такой скрипт к примеру:
PHP код:

<?php
$fp 
fsockopen("ya.ru"80$errno$errstr30);
if (!
$fp) {
    echo 
"$errstr ($errno)<br />\n";
} else {
    
$out "GET / HTTP/1.1\r\n";
    
$out .= "Host: ya.ru\r\n";
    
$out .= "Connection: Close\r\n\r\n";

    
fwrite($fp$out);
    while (!
feof($fp)) {
        echo 
fgets($fp128);
    }
    
fclose($fp);
}


warwar я тестил с вебсервером на своем же компе на speettest - получается :
без сокса 100% к примеру берем
с соксом 80%


а тут еще если брать удаленный вебсервер то и еще меньше будет. но это все неизбежная плата за потенциал.

Nightmarе 07.01.2010 06:25

Да нет, у меня на серваке всё ок, сокэты работают.
Тем более что с Атлетом одни и те же скрипты тестили, у него работает на этом сервере, у меня - нет ;(

ShAnKaR 15.01.2010 00:34

Цитата:

Сообщение от Nightmarе
Да нет, у меня на серваке всё ок, сокэты работают.
Тем более что с Атлетом одни и те же скрипты тестили, у него работает на этом сервере, у меня - нет ;(

скажи еще какая OS на сервере , и пхп 5 версии?

Nightmarе 15.01.2010 05:39

Цитата:

Сообщение от ShAnKaR
скажи еще какая OS на сервере , и пхп 5 версии?

На сервере:
Linux 2.6.18-128.4.1.el5PAE #1
PHP Version 5.2.11

Но опять таки, это у меня не работает, у атлета на ЭТОМ же сервере всё работает.

yasya17 03.02.2010 19:42

Никак не могу с этой прогой разобраться....

$Atlet$ 03.02.2010 22:43

С чем именно? Стучи в асю помогу.

Nightmarе 30.03.2010 15:44

Наконец-то, у меня всё заработало отлично.
Но только проблема точно такая-же как и с бекконнект соксом 4, то есть после успешного юзанья соединение рвётся где то через 1-2 минуты, и всё, скрипт надо только перезапускать, после чего снова работает нормально.
Если кто знает в чём примерно дело, буду очень рад

hackmon 16.04.2010 13:07

для наглядности сними видео........чтоб было более понятно!!!!!!!!!

GrAmOzEkA 16.04.2010 19:26

Такой же глюк как и у всех.
При загрузке страницы выдает (в FF):
"Время ожидания соединения истекло"

Код:

C:\Perl\bin>perl.exe C:\sss.pl 127.0.0.1:80 http://site.ru/about/photo/xx.php -d

127.0.0.1:80 => 209.85.229.104:80
127.0.0.1:80 => 216.239.59.104:80
127.0.0.1:80 => 74.125.77.104:80

В папке /tmp/ создаются сессии.

Система:
FreeBSD 7.1
Apache/1.3.41 (Unix)
FrontPage/5.0.2.2623
PHP/5.2.9
mod_ssl/2.8.31
OpenSSL/0.9.8e rus/PL30.22

Код:

$fp = fsockopen("ya.ru", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: ya.ru\r\n";
    $out .= "Connection: Close\r\n\r\n";

    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

Нормально обрабатывает.

---------------------------------
Добавлено:

Протестировал на другом сервере:
FreeBSD 6.4
PHP: 5.2.10

Все отлично работает. Но почему на том не хотело хз.
Заметил еще один глюк, иногда не до конца загружает страницу, или вообще выводит пустую белую, иногда бывает что вообще разрывает соединение.

Nightmarе 17.04.2010 00:42

GrAmOzEkA, если есть KIS или Outpost, ковыряй ихние настройки, полностью исключив пЭрл из правил проверки.

ShAnKaR 22.04.2010 05:18

обновил, что-то исправил

mustang777 22.04.2010 17:12

А каким способом можно шифровать траффик используя этот сокс, кроме как юзать Tor ?

r00nix 22.04.2010 18:03

Шанкар, поясни плиз - если сервак находится за гейтвэем, на котором осуществляется прокидывание портов, а так же фильтрование траффика (то есть внутрь и наружу проходят пакеты только по 80 TCP порту), получится ли использовать скрипт, чтобы получить доступ к другим портам на сервере?
В частности, интересует вопрос таймаутов - есть ли возможность с помощью этого скрипта прокинуть постоянное соединение? Если, например, нельзя изменить время выполнения PHP на сервере (запрещено политиками безопасности), то других вариантов я просто не вижу.

ShAnKaR 28.04.2010 06:57

Цитата:

Сообщение от r00nix
Шанкар, поясни плиз - если сервак находится за гейтвэем, на котором осуществляется прокидывание портов, а так же фильтрование траффика (то есть внутрь и наружу проходят пакеты только по 80 TCP порту), получится ли использовать скрипт, чтобы получить доступ к другим портам на сервере?

ну это зависит как фаервол настроен уже на сервере, но так локальный трафик нет смысла рубить.

Цитата:

В частности, интересует вопрос таймаутов - есть ли возможность с помощью этого скрипта прокинуть постоянное соединение? Если, например, нельзя изменить время выполнения PHP на сервере (запрещено политиками безопасности), то других вариантов я просто не вижу.
через промежуточный процесс можно сделать- тоесть запускаем к примеру perl скрипт на сервере делаем fork и он висит сколько надо либо уже руководствуясь другими ограничениями. общается по tcp с тем чем надо и паралельно с php скриптом

r00nix 07.05.2010 09:30

Цитата:

Сообщение от ShAnKaR
через промежуточный процесс можно сделать- тоесть запускаем к примеру perl скрипт на сервере делаем fork и он висит сколько надо либо уже руководствуясь другими ограничениями. общается по tcp с тем чем надо и паралельно с php скриптом

Понял твою идею, она хороша, но мне она, к сожалению, не подходит. Попробую объяснить, почему. Имеется такая схема:

A - клиентская машина.
B - файрволл.
C[1;n] - кластер веб-серверов (для снижения нагрузки).
Файрволл B является шлюзом для кластера C. К нему у меня доступа нет.
Пытаюсь рассужать логически, как идет трафик от А к С(n). Судя по всему, на В две сетевые карты, В1 и В2. В1 смотрит во внешку, а В2 - во внутреннюю сеть, в которой помимо кластера С находятся еще кластер с базой данных и NFS-серверы. Внутри сети трафик не фильтруется никак, при попытке обратиться во внешку - пакеты попадают на В2, на котором режется все, кроме транзитного трафика на 80 порт ТСР в обе стороны (видимо, админы недоглядели), который свободно уходит из внутренней сети во внешку. На файрволле стоит прокси (судя по всему - сквид), который смотрит во внешку на интерфейсе В1 на 80 порту и прозрачно форвардит запросы на случайно выбранный сервер из кластера С. Наличие прокси проверено опытным путем. На В1 фильтруется весь входящий трафик, кроме того, что идет на 80 ТСР. Также есть такая вероятность, что сквид стоит на одной из машин во внутренней сети, а с В1 на него трафик просто натится.
Итак, я с машины А браузером обращаюсь на В и вижу страницу с C(n), где n - случайным образом выбранная машина из кластера С. Все машины в кластере настроены одинаково, DocumentRoot на всех - это примонтированная директория одного NFS-сервера. У меня есть доступ к С через веб-шелл, с правами пользователя виртуального хостинга. Допустим, мне необходимо проксировать все свои запросы во внутреннюю сеть (к примеру, я хочу подключиться по ssh на одну из машин) - для этого мне нужна постоянная сессия. Почему я не могу при этом воспользоваться твоим советом - ты, думаю, понял. Поднимать демона на perl на каждом сервере из кластера для общения с ним через php скрипт, который будет доступен через веб-морду - это не вариант, так как для постоянной сессии придется реализовывать довольно непростой интерфейс для общения демонов на разных машинах в кластере между собой - что-то вроде RPC с блэкджеком и печеньками.
Можно, конечно, поступить совсем просто - сделать бэкконнект с одной из машин кластера на 80 порт ТСР своей тачки, но вся проблема в том, что под рукой нет машин с белым ипом и свободным 80 портом. Отсюда вытекает еще одна идея - грубо говоря, на третьей стороне на веб-интерфейсе будет php скрипт, на который периодически будет стучать демон с оного из серверов кластера, оставлять свой out и получать задания. Php скрипт, в свою очередь, при каждом выполнении будет транслировать out на прослушиваемый на моем компе порт и брать задания с этого же порта. Но эта идея обречена на провал - скорость каждого "пакета" в такой "сессии" будет измеряться десятками секунд, и если попробовать завернуть в такую RPC (а это именно она) обычный tcp трафик (чего я и хочу первоначально добиться) - то это будет просто смешно.
В общем, у меня такое впечатление, что кроме бэкконнекта в моем случае ничего сделать не получится. Может, я где-то заблуждаюсь, и все-таки можно что-то придумать, используя те идеи, которые реализованы в топике?

ShAnKaR 07.05.2010 16:22

бекконект возможно тоже не получится из за того что трафик будет обрабатыватся прокси сервером. можно попробовать использовать dns tunnel но тут тоже нужен сервер с белым ip и 53 портом.
твой предложенный вариант в принципе можно попробовать реализовать, задержки конечно будут значительные как ты и сказал.

а так еще если я правильно все понял, проблема использования этого скрипта в том что машины меняются постоянно и постоянной сессии не получается из за этого.
тут вариант - так как веб папка везде одна- на nfs находится, изменить настройки скрипта так чтоб unix сокет создавался в папке nfs а не /tmp/ тоесть на всех тачках он будет неизменен и один и ничто не помешает держать сессию я думаю.

это как с обычными сессиями php если тачка меняется то php уже не находит сессию. а если файлы сессий хранятся в общей папке то все работает.

r00nix 07.05.2010 20:15

Цитата:

Сообщение от ShAnKaR
бекконект возможно тоже не получится из за того что трафик будет обрабатыватся прокси сервером. можно попробовать использовать dns tunnel но тут тоже нужен сервер с белым ip и 53 портом.

Бэкконнект вполне возможен - транзитный трафик на 80 ТСР пропускается свободно и напрямую. Проверял tcpdump'ом на удаленном хосте. DNS-туннель не получится - UDP режется, резолвинга во внутренней сети нет вообще.
А вот за идею с одним сокетом на нескольких машинах огромное спасибо.

rap1t 20.05.2010 15:53

вопрос с разрывом соединения и перезапуском, кто-нить решил?

Nightmarе 03.06.2010 16:51

Цитата:

Сообщение от rap1t
вопрос с разрывом соединения и перезапуском, кто-нить решил?

Поддерживаю, очень хотелось бы реализацию норм сокса, без постоянных разрывов связи, или хотя бы поясните, может быть на Stream Socket Transports такое попросту нереализуемо? или же дело в самом сервере? может на разрывы влияют какие нибудь параметры php настроенные не так?


Время: 00:16