• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья 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 присутствует
 
Мы в соцсетях:

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