Add initial files
Co-authored-by: Ezequiel Bellver <ebellver@itba.edu.ar> Co-authored-by: Juan Barmasch <jbarmasch@itba.edu.ar>
This commit is contained in:
commit
a9b3a97798
|
@ -0,0 +1,15 @@
|
||||||
|
.config/
|
||||||
|
.gdb_history
|
||||||
|
.gdbinit
|
||||||
|
.idea/
|
||||||
|
.inputrc
|
||||||
|
.viminfo
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
patches/
|
||||||
|
|
||||||
|
## Output
|
||||||
|
server
|
||||||
|
client
|
||||||
|
*.o
|
||||||
|
a.out
|
|
@ -0,0 +1,24 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021-2022 Santiago Lo Coco \
|
||||||
|
Copyright (c) 2021-2022 Juan Martín Barmasch \
|
||||||
|
Copyright (c) 2021-2022 Ezequiel Bellver
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
CC = gcc
|
||||||
|
# CC = clang
|
||||||
|
CCFLAGS = -std=c11 -Wall -Wextra -Werror -Wno-unused-parameter -Wno-implicit-fallthrough -pedantic -pedantic-errors -fsanitize=address -g
|
||||||
|
|
||||||
|
SERVER_SOURCES=src/server.c src/args.c
|
||||||
|
CLIENT_SOURCES=src/client.c
|
||||||
|
SERVER_LIBS=include/server.h include/args.h
|
||||||
|
CLIENT_LIBS=include/client.h
|
||||||
|
SERVER_OBJ=server
|
||||||
|
CLIENT_OBJ=client
|
||||||
|
|
||||||
|
all: $(CLIENT_OBJ) $(SERVER_OBJ)
|
||||||
|
|
||||||
|
$(SERVER_OBJ): $(SERVER_SOURCES) $(SERVER_LIBS)
|
||||||
|
$(CC) $(CCFLAGS) -o $(SERVER_OBJ) $(SERVER_SOURCES)
|
||||||
|
|
||||||
|
$(CLIENT_OBJ): $(CLIENT_SOURCES) $(CLIENT_LIBS)
|
||||||
|
$(CC) $(CCFLAGS) -o $(CLIENT_OBJ) $(CLIENT_SOURCES)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(CLIENT_OBJ) $(SERVER_OBJ)
|
||||||
|
|
||||||
|
test:
|
||||||
|
pvs-studio-analyzer trace -- make
|
||||||
|
pvs-studio-analyzer analyze
|
||||||
|
plog-converter -a '64:1,2,3;GA:1,2,3;OP:1,2,3' -t tasklist -o report.tasks PVS-Studio.log
|
||||||
|
cppcheck --quiet --enable=all --force --inconclusive .
|
||||||
|
|
||||||
|
cleanTest:
|
||||||
|
rm -f PVS-Studio.log report.tasks strace_out
|
||||||
|
|
||||||
|
.PHONY: all clean test cleanTest
|
|
@ -0,0 +1,74 @@
|
||||||
|
# BProxy
|
||||||
|
|
||||||
|
BProxy (Bottler Proxy)
|
||||||
|
|
||||||
|
## Tabla de contenidos
|
||||||
|
- [Requisitos <a name="requisitos"></a>](#requisitos-)
|
||||||
|
- [Compilación <a name="compilación"></a>](#compilación-)
|
||||||
|
- [Ejecución <a name="ejecución"></a>](#ejecución-)
|
||||||
|
- [Testeos <a name="tests"></a>](#testeos-)
|
||||||
|
- [Limpieza <a name="limpieza"></a>](#limpieza-)
|
||||||
|
|
||||||
|
## Requisitos <a name="requisitos"></a>
|
||||||
|
|
||||||
|
Debe instalar gcc y make. Estos se encuentran disponibles en el repositorio de la vasta mayoría de distribuciones de Linux/macOS.
|
||||||
|
|
||||||
|
## Compilación <a name="compilación"></a>
|
||||||
|
|
||||||
|
Para compilar todos los archivos se debe hacer:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make all
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ejecución <a name="ejecución"></a>
|
||||||
|
|
||||||
|
Ahora, tendrá dos ejecutables: `client` y `server`. Note que primero debe correr el `server` y luego conectarse con el `client`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./server
|
||||||
|
```
|
||||||
|
|
||||||
|
y en otra terminal
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./client
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testeos <a name="tests"></a>
|
||||||
|
|
||||||
|
En orden de realizar un análisis estático del sistema usted debe tener instalado [cppcheck](http://cppcheck.net/) y [pvs-studio](https://pvs-studio.com/). Luego, puede correrlos con:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make test
|
||||||
|
```
|
||||||
|
|
||||||
|
Por último, si quiere hacer un análisis dinámico (usando [valgrind](https://valgrind.org/)) puede hacerlo mediante:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
valgrind ./server
|
||||||
|
```
|
||||||
|
|
||||||
|
y en otra terminal
|
||||||
|
|
||||||
|
```bash
|
||||||
|
valgrind ./client
|
||||||
|
```
|
||||||
|
|
||||||
|
## Limpieza <a name="limpieza"></a>
|
||||||
|
Si desea borrar los archivos creados luego de la compilación debe correr:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make clean
|
||||||
|
```
|
||||||
|
|
||||||
|
Note que si, además, quiere borrar el output de los tests (de `PVS-Studio` específicamente), lo puede hacer con:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make cleanTest
|
||||||
|
```
|
||||||
|
|
||||||
|
# Autores
|
||||||
|
- Barmasch, Juan Martín (61033)
|
||||||
|
- Bellver, Ezequiel (61268)
|
||||||
|
- Lo Coco, Santiago (61301)
|
|
@ -0,0 +1,336 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
May 24, 2022
|
||||||
|
|
||||||
|
|
||||||
|
Trabajo Práctico Especial 2022/1
|
||||||
|
Revisión 0
|
||||||
|
|
||||||
|
Resumen
|
||||||
|
|
||||||
|
Este documento describe el Trabajo Especial de la materia Protocolos
|
||||||
|
de Comunicación para la cursada del primer cuatrimestre del año 2022.
|
||||||
|
|
||||||
|
En su ejecución los alumnos DEBEN demostrar habilidad para la
|
||||||
|
programación de aplicaciones cliente/servidor con sockets, la
|
||||||
|
comprensión de estándares de la industria, y la capacidad de diseñar
|
||||||
|
protocolos de aplicación.
|
||||||
|
|
||||||
|
Terminología
|
||||||
|
|
||||||
|
Las palabras clave "DEBE", "NO DEBE", "OBLIGATORIO", "DEBERÁ", "NO
|
||||||
|
DEBERÁ", "DEBERÍA", "NO DEBERÍA", "RECOMENDADO", "PUEDE" y "OPCIONAL"
|
||||||
|
en este documento serán interpretadas como se describe en el RFC 2119
|
||||||
|
[RFC2119].
|
||||||
|
|
||||||
|
Tabla de Contenidos
|
||||||
|
|
||||||
|
1. Requerimientos Funcionales . . . . . . . . . . . . . . . . . 1
|
||||||
|
2. Requerimientos No Funcionales . . . . . . . . . . . . . . . . 2
|
||||||
|
3. Evaluación . . . . . . . . . . . . . . . . . . . . . . . . . 4
|
||||||
|
4. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . 6
|
||||||
|
4.1. Normative References . . . . . . . . . . . . . . . . . . 6
|
||||||
|
4.2. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 6
|
||||||
|
|
||||||
|
1. Requerimientos Funcionales
|
||||||
|
|
||||||
|
El objetivo del trabajo es implementar un servidor proxy para el
|
||||||
|
protocolo SOCKSv5[RFC1928].
|
||||||
|
|
||||||
|
El servidor DEBE
|
||||||
|
|
||||||
|
1. atender a múltiples clientes en forma concurrente y simultánea
|
||||||
|
(al menos 500).
|
||||||
|
|
||||||
|
2. soportar autenticación usuario / contraseña [RFC1929].
|
||||||
|
|
||||||
|
3. soportar de mínima conexiones salientes a a servicios TCP a
|
||||||
|
direcciones IPv4, IPV6, o utilizando FQDN que resuelvan
|
||||||
|
cualquiera de estos tipos de direcciones.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Enunciado [Pag. 1]
|
||||||
|
|
||||||
|
Trabajo Especial 2020/2 May 2022
|
||||||
|
|
||||||
|
|
||||||
|
4. ser robusto en cuanto a las opciones de conexión (si se utiliza
|
||||||
|
un FQDN que resuelve a múltiples direcciones IP y una no está
|
||||||
|
disponible debe intentar con otros).
|
||||||
|
|
||||||
|
5. reportar los fallos a los clientes usando toda la potencia del
|
||||||
|
protocolo.
|
||||||
|
|
||||||
|
6. implementar mecanismos que permitan recolectar métricas que
|
||||||
|
ayuden a monitorear la operación del sistema.
|
||||||
|
|
||||||
|
A. cantidad de conexiones históricas
|
||||||
|
|
||||||
|
B. cantidad de conexiones concurrentes
|
||||||
|
|
||||||
|
C. cantidad de bytes transferidos
|
||||||
|
|
||||||
|
D. cualquier otra métrica que considere oportuno para el
|
||||||
|
entendimiento del funcionamiento dinámico del sistema
|
||||||
|
|
||||||
|
Las métricas PUEDEN ser volátiles (si se reinicia el servidor las
|
||||||
|
estadísticas pueden perderse).
|
||||||
|
|
||||||
|
7. implementar mecanismos que permitan manejar usuarios cambiar la
|
||||||
|
configuración del servidor en tiempo de ejecución sin reiniciar
|
||||||
|
el servidor. Las diferentes implementaciones PUEDEN decidir
|
||||||
|
disponibilizar otros cambios de ejecución en tiempo de ejecución
|
||||||
|
de otras configuraciones (memoria utilizada en I/O, timeouts,
|
||||||
|
etc).
|
||||||
|
|
||||||
|
8. implementar un registro de acceso que permitan a un administrador
|
||||||
|
entender los accesos de cada uno de los usuarios. Pensar en el
|
||||||
|
caso de que llega una queja externa y el administrador debe saber
|
||||||
|
quien fue el que se conectó a cierto sitio web y cuando.
|
||||||
|
|
||||||
|
9. monitorear el tráfico y generar un registro de credenciales de
|
||||||
|
acceso (usuarios y passwords) de forma similar a ettercap por lo
|
||||||
|
menos para protocolo POP3.
|
||||||
|
|
||||||
|
2. Requerimientos No Funcionales
|
||||||
|
|
||||||
|
Adicionalmente, la implementación DEBE
|
||||||
|
|
||||||
|
1. Estar escritos en el lenguaje de programación C, específicamente
|
||||||
|
con la variante C11 (ISO/IEC 9899:2011).
|
||||||
|
|
||||||
|
2. Utilizar sockets en modo no bloqueante multiplexada.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Enunciado [Pag. 2]
|
||||||
|
|
||||||
|
Trabajo Especial 2020/2 May 2022
|
||||||
|
|
||||||
|
|
||||||
|
3. Tener en cuenta todos los aspectos que hagan a la buena
|
||||||
|
performance, escalabilidad y disponibilidad del servidor. Se
|
||||||
|
espera que se maneje de forma eficiente los flujos de información
|
||||||
|
(por ejemplo no cargar en memoria mensajes muy grandes, ser
|
||||||
|
eficaz y eficiente en el intérprete de mensajes). El informe
|
||||||
|
DEBE contener información sobre las pruebas de stress. Algunas
|
||||||
|
preguntas interesantes a responder son:
|
||||||
|
|
||||||
|
* ¿Cual es la máxima cantidad de conexiones simultáneas que
|
||||||
|
soporta?
|
||||||
|
|
||||||
|
* ¿Cómo se degrada el throughput?
|
||||||
|
|
||||||
|
4. Seguir los lineamientos de IEEE Std 1003.1-2008, 2016 Edition /
|
||||||
|
Base definitions / 12. Utility Conventions [1] a menos que se
|
||||||
|
especifique lo contrario: Esto se refiere a cómo manejar
|
||||||
|
argumentos de línea de comandos, parámetros, etc
|
||||||
|
|
||||||
|
5. Deberá documentar detalladamente el protocolo de monitoreo y
|
||||||
|
configuración e implementar una aplicación cliente.
|
||||||
|
|
||||||
|
6. Tanto la aplicación servidor, como la aplicación cliente de
|
||||||
|
configuración/monitoreo DEBERÁN manejar los argumentos de línea
|
||||||
|
de comandos de cierta forma uniforme (por ejemplo -c <puerto>
|
||||||
|
podría especificar el puerto utilizado para el protocolo de
|
||||||
|
configuración/monitoreo). Los detalles de qué parámetros se
|
||||||
|
deben manejar será publicado en otro documento.
|
||||||
|
|
||||||
|
7. Si bien las programas son pequeños podrá utilizar librerías o
|
||||||
|
archivos (fragmento de código) desarrollados por terceros siempre
|
||||||
|
que se cumplan los siguientes requisitos:
|
||||||
|
|
||||||
|
A. La librería o fragmento NO DEBE resolver las cuestiones de
|
||||||
|
fondo del Trabajo Práctico.
|
||||||
|
|
||||||
|
B. La librería o fragmento DEBE tener una licencia aprobada por
|
||||||
|
la Open Source Initiative [2].
|
||||||
|
|
||||||
|
C. El uso de la librería o fragmento DEBE ser aprobada por la
|
||||||
|
Cátedra.
|
||||||
|
|
||||||
|
Para lograr la aprobación un alumno del grupo DEBE publicar una
|
||||||
|
secuencia en el foro de discusión del trabajo práctico. La
|
||||||
|
secuencia DEBE describir todos aquellos datos que permitan
|
||||||
|
identificar a la librería (por ejemplo la versión); su licencia
|
||||||
|
de esta forma justificando porqué es válido su uso; y el
|
||||||
|
propósito de su inclusión. En caso de que sea un fragmento de
|
||||||
|
código debe adjuntarse. Está permitido utilizar código publicado
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Enunciado [Pag. 3]
|
||||||
|
|
||||||
|
Trabajo Especial 2020/2 May 2022
|
||||||
|
|
||||||
|
|
||||||
|
por los docentes durante la cursada actual, siempre que se
|
||||||
|
atribuya correctamente.
|
||||||
|
|
||||||
|
8. A veces existirán ambigüedades en las especificaciones o
|
||||||
|
múltiples formas en como se puede resolver o implementar un
|
||||||
|
problema particular. Por ser una materia de ingeniería se espera
|
||||||
|
que los alumnos tomen decisiones de diseño razonables en estos
|
||||||
|
casos. Los alumnos pueden basar sus decisiones en lo que conoce
|
||||||
|
de ante mano de la tarea y en los objetivos enumerados en este
|
||||||
|
documento o demás enunciados. Los docentes pueden darle consejos
|
||||||
|
sobre las ventajas y desventajas de cada decisiones, pero los
|
||||||
|
alumnos son los que en última instancia las toman.
|
||||||
|
|
||||||
|
3. Evaluación
|
||||||
|
|
||||||
|
La realización del Trabajo Práctico es una actividad grupal. La
|
||||||
|
calificación es de carácter grupal; pero si hay evidencias de que un
|
||||||
|
alumno de un grupo no participó en la elaboración, o éste no puede
|
||||||
|
defender o demostrar su participación, entonces el alumno no podrá
|
||||||
|
aprobar el Trabajo Práctico. Se espera transparencia en el
|
||||||
|
desarrollo del trabajo (entregar el repositorio git).
|
||||||
|
|
||||||
|
Cada grupo DEBE entregar todo el material necesario para poder
|
||||||
|
reproducir el Trabajo Práctico. Como mínimo DEBE contener:
|
||||||
|
|
||||||
|
a. Un informe en formato PDF [RFC3778] o text/plain (con
|
||||||
|
codificación UTF-8) que contenga las siguientes secciones
|
||||||
|
(respetando el orden):
|
||||||
|
|
||||||
|
1. Índice
|
||||||
|
|
||||||
|
2. Descripción detallada de los protocolos y aplicaciones
|
||||||
|
desarrolladas.
|
||||||
|
|
||||||
|
3. Problemas encontrados durante el diseño y la implementación.
|
||||||
|
|
||||||
|
4. Limitaciones de la aplicación.
|
||||||
|
|
||||||
|
5. Posibles extensiones.
|
||||||
|
|
||||||
|
6. Conclusiones.
|
||||||
|
|
||||||
|
7. Ejemplos de prueba.
|
||||||
|
|
||||||
|
8. Guía de instalación detallada y precisa. No es necesario
|
||||||
|
desarrollar un programa instalador.
|
||||||
|
|
||||||
|
9. Instrucciones para la configuración.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Enunciado [Pag. 4]
|
||||||
|
|
||||||
|
Trabajo Especial 2020/2 May 2022
|
||||||
|
|
||||||
|
|
||||||
|
10. Ejemplos de configuración y monitoreo.
|
||||||
|
|
||||||
|
11. Documento de diseño del proyecto (que ayuden a entender la
|
||||||
|
arquitectura de la aplicación).
|
||||||
|
|
||||||
|
b. Códigos fuente y archivos de construcción
|
||||||
|
|
||||||
|
c. Un archivo README en la raíz que describa al menos:
|
||||||
|
|
||||||
|
A. la ubicación de todos los materiales previamente enumerados
|
||||||
|
|
||||||
|
B. el procedimiento necesario para generar una versión
|
||||||
|
ejecutable de las aplicaciones
|
||||||
|
|
||||||
|
C. la ubicación de los diferentes artefactos generados
|
||||||
|
|
||||||
|
D. cómo se debe ejecutar las diferentes artefactos generados (y
|
||||||
|
sus opciones)
|
||||||
|
|
||||||
|
La entrega se realizará por Campus ITBA en la asignación creada para
|
||||||
|
ello con una fecha de entrega. Se DEBE entregar un tarball que sea
|
||||||
|
el producto de clonar el repositorio GIT (por lo tanto el repositorio
|
||||||
|
GIT DEBE contener todos los materiales de entrega), y su historia.
|
||||||
|
|
||||||
|
Una vez realizada la entrega los grupos DEBERÁN mostrar el correcto
|
||||||
|
funcionamiento del sistema con casos de prueba provisto por los
|
||||||
|
equipos y provistos ese día por la Cátedra.
|
||||||
|
|
||||||
|
Para aprobar el Trabajo Práctico se DEBE cumplir TODAS las siguientes
|
||||||
|
condiciones:
|
||||||
|
|
||||||
|
o El material entregado DEBE estar completo (por ejemplo no se puede
|
||||||
|
corregir si falta el informe o alguna clase)
|
||||||
|
|
||||||
|
o Se utilizan únicamente las librería permitidas para los usos
|
||||||
|
definidos.
|
||||||
|
|
||||||
|
o DEBE ser correcta las cuestiones de entradas/salida no bloqueante.
|
||||||
|
Por ejemplo las lecturas, escrituras y el establecimiento de
|
||||||
|
nuevas conexiones DEBEN ser mediante suscripciones y no
|
||||||
|
bloquearse.
|
||||||
|
|
||||||
|
o DEBE ser correcta las cuestiones relacionadas a la lectura/
|
||||||
|
escrituras parciales.
|
||||||
|
|
||||||
|
o Sumar CUATRO puntos de calificación sobre DIEZ puntos posibles.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Enunciado [Pag. 5]
|
||||||
|
|
||||||
|
Trabajo Especial 2020/2 May 2022
|
||||||
|
|
||||||
|
|
||||||
|
Se aceptarán entregas tardías entre 0 horas (inclusive) y 24 horas
|
||||||
|
(exclusivo) luego de la fecha límite de entrega, pero la calificación
|
||||||
|
no podrá execeder de CUATRO puntos.
|
||||||
|
|
||||||
|
4. Referencias
|
||||||
|
|
||||||
|
4.1. Normative References
|
||||||
|
|
||||||
|
[RFC1928] Leech, M., Ganis, M., Lee, Y., Kuris, R., Koblas, D., and
|
||||||
|
L. Jones, "SOCKS Protocol Version 5", RFC 1928, March
|
||||||
|
1996.
|
||||||
|
|
||||||
|
[RFC1929] Leech, M., "Username/Password Authentication for SOCKS
|
||||||
|
V5", RFC 1929, DOI 10.17487/RFC1929, March 1996,
|
||||||
|
<https://www.rfc-editor.org/info/rfc1929>.
|
||||||
|
|
||||||
|
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
|
||||||
|
Requirement Levels", BCP 14, RFC 2119, March 1997.
|
||||||
|
|
||||||
|
[RFC3778] Taft, E., Pravetz, J., Zilles, S., and L. Masinter, "The
|
||||||
|
application/pdf Media Type", RFC 3778,
|
||||||
|
DOI 10.17487/RFC3778, May 2004,
|
||||||
|
<http://www.rfc-editor.org/info/rfc3778>.
|
||||||
|
|
||||||
|
4.2. URIs
|
||||||
|
|
||||||
|
[1] https://pubs.opengroup.org/onlinepubs/9699919799/nframe.html
|
||||||
|
|
||||||
|
[2] https://opensource.org/licenses
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Enunciado [Pag. 6]
|
|
@ -0,0 +1,132 @@
|
||||||
|
.\" Macros
|
||||||
|
.ds PX \s-1POSIX\s+1
|
||||||
|
.de EXAMPLE .\" Format de los ejemplos
|
||||||
|
.RS 10
|
||||||
|
.BR "\\$1"
|
||||||
|
.RE
|
||||||
|
..
|
||||||
|
|
||||||
|
.TH socks5d 0.0.0 "24 de mayo 2022"
|
||||||
|
.LO 8
|
||||||
|
.SH NAME
|
||||||
|
socks5d \- proxy SOCKS versión 5 con esteroides
|
||||||
|
|
||||||
|
.SH SINOPSIS
|
||||||
|
.HP 10
|
||||||
|
.B socks5d
|
||||||
|
[ POSIX style options ]
|
||||||
|
|
||||||
|
.SH OPCIONES
|
||||||
|
|
||||||
|
.\".IP "\fB\-d\fB"
|
||||||
|
.\"Establece que debe ejecutar con la configuración predeterminada.
|
||||||
|
.\".IP
|
||||||
|
.\"Aquellos servidores donde la configuración sea persistente (el enunciado
|
||||||
|
.\"no lo requiere) presentan un desafío a la hora de realizar pruebas ya que
|
||||||
|
.\"se debe conocer la configuración actual.
|
||||||
|
.\".IP
|
||||||
|
.\"En esos casos esta opción olvida toda configuración previa y establece
|
||||||
|
.\"la configuración predeterminada.
|
||||||
|
.\".IP
|
||||||
|
.\"La configuración predeterminada consiste en tener apagada las transformaciones.
|
||||||
|
|
||||||
|
.IP "\fB-h\fR"
|
||||||
|
Imprime la ayuda y termina.
|
||||||
|
|
||||||
|
.IP "\fB\-l\fB \fIdirección-socks\fR"
|
||||||
|
Establece la dirección donde servirá el proxy SOCKS.
|
||||||
|
Por defecto escucha en todas las interfaces.
|
||||||
|
|
||||||
|
.IP "\fB\-N\fB"
|
||||||
|
Deshabilita los passwords disectors.
|
||||||
|
|
||||||
|
.IP "\fB\-L\fB \fIdirección-de-management\fR"
|
||||||
|
Establece la dirección donde servirá el servicio de
|
||||||
|
management. Por defecto escucha únicamente en loopback.
|
||||||
|
|
||||||
|
.IP "\fB\-p\fB \fIpuerto-local\fR"
|
||||||
|
Puerto TCP donde escuchará por conexiones entrantes SOCKS.
|
||||||
|
Por defecto el valor es \fI1080\fR.
|
||||||
|
|
||||||
|
.IP "\fB\-P\fB \fIpuerto-conf\fR"
|
||||||
|
Puerto SCTP donde escuchará por conexiones entrante del protocolo
|
||||||
|
de configuración. Por defecto el valor es \fI8080\fR.
|
||||||
|
|
||||||
|
.IP "\fB\-u\fB \fIuser:pass\fR"
|
||||||
|
Declara un usuario del proxy con su contraseña. Se puede utilizar
|
||||||
|
hasta 10 veces.
|
||||||
|
|
||||||
|
|
||||||
|
.IP "\fB\-v\fB"
|
||||||
|
Imprime información sobre la versión versión y termina.
|
||||||
|
|
||||||
|
.SH REGISTRO DE ACCESO
|
||||||
|
|
||||||
|
Registra el uso del proxy en salida estandar. Una conexión por línea. Los campos de una
|
||||||
|
línea separado por tabs:
|
||||||
|
|
||||||
|
.IP "\fBfecha\fR"
|
||||||
|
que se procesó la conexión en formato ISO-8601.
|
||||||
|
Ejemplo 2022-06-15T19:56:34Z.
|
||||||
|
|
||||||
|
.IP "\fBnombre de usuario\fR"
|
||||||
|
que hace el requerimiento.
|
||||||
|
Ejemplo juan.
|
||||||
|
|
||||||
|
.IP "\fBtipo de registro\fR"
|
||||||
|
Siempre el caracter A.
|
||||||
|
|
||||||
|
.IP "\fBdireccion IP origen\fR"
|
||||||
|
desde donde se conectó el usuario.
|
||||||
|
Ejemplo ::1.
|
||||||
|
|
||||||
|
.IP "\fBpuerto origen\fR"
|
||||||
|
desde donde se conectó el usuario.
|
||||||
|
Ejemplo 54786.
|
||||||
|
|
||||||
|
.IP "\fBdestino\fR"
|
||||||
|
a donde nos conectamos. nombre o dirección IP (según ATY).
|
||||||
|
Ejemplo www.itba.edu.ar.
|
||||||
|
Ejemplo ::1.
|
||||||
|
|
||||||
|
.IP "\fBpuerto destino\fR" a donde nos conectamos.
|
||||||
|
Ejemplo 443.
|
||||||
|
|
||||||
|
.IP "\fBstatus\fR" status SOCKS (0 exito, ...)
|
||||||
|
Status code de SOCKSv5. Ejemplo 0.
|
||||||
|
|
||||||
|
|
||||||
|
.SH REGISTRO DE PASSWORDS
|
||||||
|
|
||||||
|
Registra las credenciales descubiertas en salida estandar. Una credencial por línea.
|
||||||
|
Los campos de una línea separados por tabs:
|
||||||
|
|
||||||
|
.IP "\fBfecha\fR"
|
||||||
|
que se procesó la conexión en formato ISO-8601.
|
||||||
|
Ejemplo 2020-06-15T19:56:34Z.
|
||||||
|
|
||||||
|
.IP "\fBnombre de usuario\fR"
|
||||||
|
que hace el requerimiento.
|
||||||
|
Ejemplo juan.
|
||||||
|
|
||||||
|
.IP "\fBtipo de registro\fR"
|
||||||
|
Siempre el caracter P.
|
||||||
|
|
||||||
|
|
||||||
|
.IP "\fBprotocolo\fR"
|
||||||
|
Protocolo del que se trata. HTTP o POP3.
|
||||||
|
|
||||||
|
.IP "\fBdestino\fR"
|
||||||
|
a donde nos conectamos. nombre o dirección IP (según ATY).
|
||||||
|
Ejemplo www.itba.edu.ar.
|
||||||
|
Ejemplo ::1.
|
||||||
|
|
||||||
|
.IP "\fBpuerto destino\fR" a donde nos conectamos.
|
||||||
|
Ejemplo 443.
|
||||||
|
|
||||||
|
.IP "\fBusuario\fR"
|
||||||
|
Usuario descubierto.
|
||||||
|
|
||||||
|
.IP "\fBpassword\fR"
|
||||||
|
Password descubierta.
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef ARGS_H
|
||||||
|
#define ARGS_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define MAX_USERS 500
|
||||||
|
|
||||||
|
struct users {
|
||||||
|
char *name;
|
||||||
|
char *pass;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct socks5args {
|
||||||
|
char *socks_addr;
|
||||||
|
unsigned short socks_port;
|
||||||
|
|
||||||
|
char * mng_addr;
|
||||||
|
unsigned short mng_port;
|
||||||
|
|
||||||
|
bool disectors_enabled;
|
||||||
|
|
||||||
|
struct users users[MAX_USERS];
|
||||||
|
};
|
||||||
|
|
||||||
|
void parse_args(const int argc, char **argv, struct socks5args *args);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef CLIENT_H
|
||||||
|
#define CLIENT_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef SERVER_H
|
||||||
|
#define SERVER_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "args.h"
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,119 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
|
||||||
|
#include "../include/args.h"
|
||||||
|
|
||||||
|
static unsigned short port(const char *s) {
|
||||||
|
char *end = 0;
|
||||||
|
const long sl = strtol(s, &end, 10);
|
||||||
|
|
||||||
|
if (end == s || '\0' != *end || ((LONG_MIN == sl || LONG_MAX == sl) && ERANGE == errno) || sl < 0 || sl > USHRT_MAX) {
|
||||||
|
fprintf(stderr, "Port should be in the range of 1-65536: %s\n", s);
|
||||||
|
exit(1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return (unsigned short) sl;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void user(char *s, struct users *user) {
|
||||||
|
char *p = strchr(s, ':');
|
||||||
|
if (p == NULL) {
|
||||||
|
fprintf(stderr, "Password not found\n");
|
||||||
|
exit(1);
|
||||||
|
} else {
|
||||||
|
*p = 0;
|
||||||
|
p++;
|
||||||
|
user->name = s;
|
||||||
|
user->pass = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void version(void) {
|
||||||
|
fprintf(stderr, "BProxy v0.0\nITBA Protocolos de Comunicación 2021/1 -- Grupo 7\nVer LICENSE.md\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void usage(const char *progname) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Usage: %s [OPTION]\n\n"
|
||||||
|
" -h Imprime la ayuda y termina.\n"
|
||||||
|
" -l <SOCKS addr> Dirección donde servirá el proxy SOCKS.\n"
|
||||||
|
" -L <conf addr> Dirección donde servirá el servicio de management.\n"
|
||||||
|
" -p <SOCKS port> Puerto entrante conexiones SOCKS.\n"
|
||||||
|
" -P <conf port> Puerto entrante conexiones configuracion.\n"
|
||||||
|
" -u <name>:<pass> Usuario y contraseña de usuario que puede usar el proxy. Hasta 500.\n"
|
||||||
|
" -v Imprime información sobre la versión y termina.\n\n",
|
||||||
|
progname);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void parse_args(const int argc, char **argv, struct socks5args *args) {
|
||||||
|
memset(args, 0, sizeof(*args));
|
||||||
|
|
||||||
|
args->socks_addr = "0.0.0.0";
|
||||||
|
args->socks_port = 1080;
|
||||||
|
|
||||||
|
args->mng_addr = "127.0.0.1";
|
||||||
|
args->mng_port = 8080;
|
||||||
|
|
||||||
|
args->disectors_enabled = true;
|
||||||
|
|
||||||
|
int c;
|
||||||
|
int nusers = 0;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
c = getopt(argc, argv, "hl:L:Np:P:u:v");
|
||||||
|
if (c == -1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case 'h':
|
||||||
|
usage(argv[0]);
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
args->socks_addr = optarg;
|
||||||
|
break;
|
||||||
|
case 'L':
|
||||||
|
args->mng_addr = optarg;
|
||||||
|
break;
|
||||||
|
case 'N':
|
||||||
|
args->disectors_enabled = false;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
args->socks_port = port(optarg);
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
args->mng_port = port(optarg);
|
||||||
|
break;
|
||||||
|
case 'u':
|
||||||
|
if(nusers >= MAX_USERS) {
|
||||||
|
fprintf(stderr, "Maximun number of command line users reached: %d.\n", MAX_USERS);
|
||||||
|
exit(1);
|
||||||
|
} else {
|
||||||
|
user(optarg, args->users + nusers);
|
||||||
|
nusers++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
version();
|
||||||
|
exit(0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "unknown argument %d.\n", c);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind < argc) {
|
||||||
|
fprintf(stderr, "Argument not accepted: ");
|
||||||
|
while (optind < argc) {
|
||||||
|
fprintf(stderr, "%s ", argv[optind++]);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
// This is a personal academic project. Dear PVS-Studio, please check it.
|
||||||
|
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
|
||||||
|
#include "../include/client.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
// This is a personal academic project. Dear PVS-Studio, please check it.
|
||||||
|
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
|
||||||
|
#include "../include/server.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
struct socks5args * args = malloc(sizeof(struct socks5args));
|
||||||
|
parse_args(argc, argv, args);
|
||||||
|
}
|
Loading…
Reference in New Issue