У меня есть программа черного ящика, которая прослушивает определенный порт UDP. Я бы хотел, чтобы он прослушивал порт UDP по своему выбору.

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

Виртуальная машина, конечно, является жестким вариантом.

2 ответа2

2

Вы можете использовать iptables для переадресации одного порта на другой. Это будет работать только для внешних подключений, потому что таблицы nat, которые использует следующее решение, не используются, когда трафик локальный (т. Е. От 127.0.0.1 до 127.0.0.1 и т.д. И т.д.).

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

Начните с включения переадресации, если это уже не с sysctl net.ipv4.ip_forward=1 или echo 1 > /proc/sys/net/ipv4/ip_forward . В этом случае вам, вероятно, следует также сделать все политики iptables DROP вместо ACCEPT по умолчанию (хотя это зависит от используемого вами дистрибутива GNU /Linux) и разрешить только тот трафик, который вы хотели бы пройти, вместо того, чтобы позволить всему течь свободно ,

Затем вы можете добавить правило в таблицу nat PREROUTING для перенаправления трафика, предназначенного для порта X, на порт Y. Например, для перенаправления входящего трафика на порт TCP 2222 на порт вашего SSH-сервера, TCP 22, используйте это: iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-port 22 .

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

0

Лучшее решение - использовать netcat. Это работает также с соединениями с localhost, и нет необходимости менять sysctl.

Весь трюк в том, чтобы создать named pipe ,

 mkfifo mypipe

и используйте это так:

nc -k -l 2222 0<mypipe | nc localhost mySSHport 1>mypipe

Этот пример был создан, чтобы позволить вам протестировать эту команду с помощью ssh. Он перенаправляет соединения ssh с порта 2222 на порт mySSHport, что бы это ни было (22?).

Теперь, если вы попытаетесь SSH в порт 2222,

 ssh me@localhost -p 2222

Вы будете авторизованы.

Флаг -k инструктирует netcat продолжать прослушивание даже после завершения первого соединения. Вы можете улучшить его устойчивость, вставив его в бесконечный цикл while:

while true; do
# echo "Listening..."
nc -k -l 2222 0<mypipe | nc localhost mySSHport 1>mypipe
done

И, конечно, возвращаясь к OP, для портов UDP нужно добавить флаг -u.

Редактировать:

Я только что понял, что в системах под управлением GNU-версии nc (netcat), таких как Arch Linux, команда должна быть

 nc -l -p 2222 0<mypipe | nc localhost mySSHport 1>mypipe

Извиняюсь за неудобства.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .