Как отправлять TCP пакеты через носки? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть этот код:

import socket
import socks

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, "IP_SOCK", PORT_SOCK, True)
s = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((target,port))
s.close()
print("Connection tested.")

Это работает, но длина пакетов равна 0. Я хотел бы добавить данные полезной нагрузки, как я могу это сделать?

Например, здесь у меня есть этот рабочий код с библиотекой scapy:

import socket
import socks
from scapy.all import *


def send(src_ip, dst_ip, dst_port):
    ip = IP(src=src_ip, dst=dst_ip)
    src_port = random.randint(20, 65000)
    transport = TCP(sport=src_port, dport=dst_port, flags="S")
    send(ip/transport/b"mydata")


if __name__ == '__main__':
    send('SRC_IP', 'DST_IP', DST_PORT)

И он действительно отправляет полезную нагрузку "mydata". Если я перехватываю его с помощью tcpdump, я могу видеть длину поля данных и «mydata» в пакете syn.

Я хотел бы отправить его через носок или http-прокси, но я не знаю как я могу это сделать.

Дело в том, что мне не нужно устанавливать sh соединение, потому что я хочу отправлять пакеты, даже если порт закрыт.

Некоторые люди продолжайте говорить мне, что я не могу использовать носки для отправки пакетов tcp. Неправда. SOCKS действует в слое 4, так что это вполне выполнимо, дело в том, что я не знаю, как это сделать в Python, так как я новичок в этом.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Некоторые люди продолжают говорить мне, что я не могу использовать носки для отправки tcp-пакетов. Это не правда.

Это правда, даже если вам это не нравится. Прокси-сервер (HTTP-прокси или Socks-прокси) не является средством пересылки пакетов на сетевом уровне. Вместо этого это пересылка полезной нагрузки на уровне приложения. Если вы хотите перенаправить пакет, вам нужен настоящий VPN (с фокусом на «N», то есть на уровне сети).

При использовании прокси-сервера Socks или HTTP необходимо установить sh TCP-соединение с прокси первый. Внутри этого TCP-соединения затем выполняется начальное рукопожатие, например аутентификация на прокси-сервере, и указывается цель, которую вы хотите достичь. Затем прокси-сервер подключается к целевому объекту, и после этого возникают два TCP-соединения: одно между клиентом и прокси, а другое между прокси и сервером. Затем прокси-сервер будет считывать оба этих соединения и перенаправлять данные, полученные на одноранговый узел, то есть данные, полученные от клиента, будут пересылаться на сервер и т. Д. c. Прокси-сервер также может изменять данные при передаче.

Поскольку прокси-сервер перенаправляет данные только на уровне приложения, невозможно передать специально созданные TCP-пакеты через прокси-сервер. А поскольку прокси-сервер поддерживает два независимых TCP-соединения и просто пересылает данные уровня приложения, даже размеры входящих и исходящих пакетов могут быть разными, то есть два входящих пакета могут быть объединены в один исходящий пакет или могут привести к трем et c. Поскольку TCP - это просто размер пакетов байтового потока, это не имеет значения на уровне приложения.

0 голосов
/ 13 апреля 2020

вы можете использовать sendall(); например: s.sendall("GET / HTTP/1.1 ...")

Подробнее см. https://pypi.org/project/PySocks/, где я получил этот пример, а также https://docs.python.org/3/library/socket.html (socks mimics python встроенный socket s)

...