• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Proxy server on Golang

logo.png

Всем доброго времени суток.

Решил попробовать написать небольшую статейку о том , как реализовать прокси сервер на хипстерском языке - Golang :)
В моих планах есть идея, написать несколько ознакомительных статей про Go. Поэтому попробуем с малого)

Итак, для начала постаим задачу: Реализовать прокси сервер с перехватом полного запроса.
показываю только самую малость :)

Первый этап:
Для начала давайте определимся с архитектурой приложения.
Golang - достаточно специфиччный в этом плане.

Для нашего проекта она будет выглядить следующим образом:
|--MitmProxy/
|----src/
|------github.com/
|--------mitmproxy/
|----------main/

В нашей задаче будут использованы , только стандартные пакеты, что приятно )

Второй этап:

Теперь мы должны разобраться , какие пакеты нам понадобяться для реализации наешего кода.


C:
import (
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
    "fmt"
)


  • log - понадобиться для логирования
  • net/http - базовый пакет для работы c HTTP протоколом
  • net/http/httputil - пакет, который имеет расширеный функционал для работы с HTTP
  • net/url - пакет для анализа URL
  • fmt - пакет для работы с вводом и выводом
Третий этап:
Приступим к написанию кода x)

Для начала мы должны решить , какой таргет у нас будет.
таргет - конечный ресурс , куда пойдет запрос
в моем случае это будет localhost:8000
target := &url.URL{Scheme: "http", Host: "localhost:8000"}

затем создадим нашу reverse proxy
np := httputil.NewSingleHostReverseProxy(target)

Ну и наконец-то запустим наш сервер, я буду поднимать его на 8088 порту
log.Fatal(http.ListenAndServe(":8088", nil))

И самый финальный штрих - получения всех запросов
Опишем функцию , которая будет перехватывать наши запросы и выводить в стандартный output
Код:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
 dReq, err := httputil.DumpRequest(r, true)
 if err != nil {
  log.Println(err)
 }
 fmt.Println(string(dReq))
 np.ServeHTTP(w, r)
})
А теперь разберемся в мелочашь и что тут происходит:

  • http.HandleFunc - обработчик запросов по "/"
  • httputil.DumpRequest - функция , которая возвращает запрос в представлениее проводника HTTP

Четвертый этап:
Теперь давайте посмотри на результат нашей прокси)

Запускаем наш сервер с проксей
go run main.go
Запускаем наш сервер на 8000
python -m SimpleHTTPServer

Screenshot from 2018-03-02 05-07-08.png


и делаем проверку:
curl http://localhost:8088


Тепрь мы можем видеть:
Screenshot from 2018-03-02 05-09-13.png
Screenshot from 2018-03-02 05-09-07.png
Screenshot from 2018-03-02 05-08-29.png


Ура. Наша прокся работает :)

Заключение

В принципе писать софт подобного рода достаточно просто. Просто нужно явно понимать , что мы хотим увидеть в результате. Я рассмотрел вариант только с http. Скелет прокси - элементарный. Расти можно куда угодно имея хотя бы небольшое представление о программировании.

Всем хороших выходных :)
P.S Замечания приветствуются, жду фидбека :3
P.P.S. Исходник -
 
A

ANR

смысл? уже есть лет так 20
конфиг с выводом в cmd или txt присутствует
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!