implement user/password auth for socks5 upstream proxy
just like the rest of the socks code, this was stolen from proxychains-ng, of which i'm happen to be the maintainer of, so it's not an issue (the licenses are identical, too).
This commit is contained in:
parent
e78b461607
commit
b8c6a2127d
40
src/reqs.c
40
src/reqs.c
@ -1285,9 +1285,15 @@ connect_to_upstream_proxy(struct conn_s *connptr, struct request_s *request)
|
|||||||
unsigned len;
|
unsigned len;
|
||||||
unsigned char buff[512]; /* won't use more than 7 + 255 */
|
unsigned char buff[512]; /* won't use more than 7 + 255 */
|
||||||
unsigned short port;
|
unsigned short port;
|
||||||
|
size_t ulen, passlen;
|
||||||
|
|
||||||
struct hostent *host;
|
struct hostent *host;
|
||||||
struct upstream *cur_upstream = connptr->upstream_proxy;
|
struct upstream *cur_upstream = connptr->upstream_proxy;
|
||||||
|
|
||||||
|
ulen = cur_upstream->ua.user ? strlen(cur_upstream->ua.user) : 0;
|
||||||
|
passlen = cur_upstream->pass ? strlen(cur_upstream->pass) : 0;
|
||||||
|
|
||||||
|
|
||||||
log_message(LOG_CONN,
|
log_message(LOG_CONN,
|
||||||
"Established connection to %s proxy \"%s\" using file descriptor %d.",
|
"Established connection to %s proxy \"%s\" using file descriptor %d.",
|
||||||
proxy_type_name(cur_upstream->type), cur_upstream->host, connptr->server_fd);
|
proxy_type_name(cur_upstream->type), cur_upstream->host, connptr->server_fd);
|
||||||
@ -1311,15 +1317,43 @@ connect_to_upstream_proxy(struct conn_s *connptr, struct request_s *request)
|
|||||||
} else if (cur_upstream->type == PT_SOCKS5) {
|
} else if (cur_upstream->type == PT_SOCKS5) {
|
||||||
|
|
||||||
/* init */
|
/* init */
|
||||||
|
int n_methods = ulen ? 2 : 1;
|
||||||
buff[0] = 5; /* socks version */
|
buff[0] = 5; /* socks version */
|
||||||
buff[1] = 1; /* number of methods */
|
buff[1] = n_methods; /* number of methods */
|
||||||
buff[2] = 0; /* no auth method */
|
buff[2] = 0; /* no auth method */
|
||||||
if (3 != safe_write(connptr->server_fd, buff, 3))
|
if (ulen) buff[3] = 2; /* auth method -> username / password */
|
||||||
|
if (2+n_methods != safe_write(connptr->server_fd, buff, 2+n_methods))
|
||||||
return -1;
|
return -1;
|
||||||
if (2 != safe_read(connptr->server_fd, buff, 2))
|
if (2 != safe_read(connptr->server_fd, buff, 2))
|
||||||
return -1;
|
return -1;
|
||||||
if (buff[0]!=5 || buff[1]!=0)
|
if (buff[0] != 5 || (buff[1] != 0 && buff[1] != 2))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (buff[1] == 2) {
|
||||||
|
/* authentication */
|
||||||
|
char in[2];
|
||||||
|
char out[515];
|
||||||
|
char *cur = out;
|
||||||
|
size_t c;
|
||||||
|
*cur++ = 1; /* version */
|
||||||
|
c = ulen & 0xFF;
|
||||||
|
*cur++ = c;
|
||||||
|
memcpy(cur, cur_upstream->ua.user, c);
|
||||||
|
cur += c;
|
||||||
|
c = passlen & 0xFF;
|
||||||
|
*cur++ = c;
|
||||||
|
memcpy(cur, cur_upstream->pass, c);
|
||||||
|
cur += c;
|
||||||
|
|
||||||
|
if((cur - out) != safe_write(connptr->server_fd, out, cur - out))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if(2 != safe_read(connptr->server_fd, in, 2))
|
||||||
|
return -1;
|
||||||
|
if(in[0] != 5 || in[1] != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* connect */
|
/* connect */
|
||||||
buff[0] = 5; /* socks version */
|
buff[0] = 5; /* socks version */
|
||||||
buff[1] = 1; /* connect */
|
buff[1] = 1; /* connect */
|
||||||
|
Loading…
Reference in New Issue
Block a user