# HTTP Vekil (Proxy)

HTTP Vekil ([Proxy](http://www.wikizero.biz/index.php?q=aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUHJveHlfc2VydmVy)) Sunucular, gelen HTTP isteklerini yönlendirir. Normalde istemci GET isteklerinde yol (path) gönderilirken; vekil sunuculara yapılan isteklerde [tam yol](https://tools.ietf.org/html/rfc7230#section-5.3.2) (URL) gönderilir.

Burp, ZAProxy gibi araçlar kullanılırken tarayıcılarda HTTP vekil sunucu ayarı yapılır. Bu araçlar güvenlik araştırmalarında sıklıkla kullanılır.

HTTP proxy'ler forward (ileri) ve reverse (tersine?) proxy'ler olmak üzere ikiye ayrılır. İç ağdan dışarı çıkan istemcilerin HTTP tarafiği ara bir sunucudan geçiyorsa bu sunucu forward proxy'dir denilebilir. Ayrıca transparan, anonim proxy'ler de mevcuttur Internet'te. *Ayrıca bkz. (socks proxy, tor proxy)*. Bu tip vekil sunucularda TLS trafiği açılıp incelenmez Burp Suite'de olduğu gibi. Bunların haricinde MITM vekil sunucular da mevcuttur. *TODO: MITM proxy araştır.*

Dışardan  örneğin Internet'ten gelen istekleri DMZ ağımızda karşılıyan NGINX, Apache gibi web sunucular karşılayıp, bu istekleri upstream/backend/asıl sunuculara yönlendirebilir. Bu yaklaşımda dışardan gelen istekler arasına bir katman daha koyarak güvenlik sağlanmaya çalışılıyor. Ayrıca reverse proxy'lere mod\_security/naxi gibi çözümler de eklenecek güvenlik artırılabiliyor. Bunlara genel olarak WAF ya da web application firewall deniliyor.&#x20;

Basit olarak bir forward proxy nasıl çalışır? Nasıl implemente edilir?

Bunun için ilk  önce [TinyProxy](https://tinyproxy.github.io/)' yi derleyip çalıştırabiliriz. TinyPRoxy hem forward proxy hem de reverse proxy olarak kullanılabilmektedir.

```
git clone https://github.com/tinyproxy/tinyproxy
cd tinyproxy
./autoreconf
./configure
./make
./src/tinyproxy -d -c ./etc/tinyproxy.conf
```

Bundan sonra proxy'miz 8888 portunda çalışmış olacak. netstat ile çalışıp çalışmadığına bakılabilir.

Şimdi örnek bir istek yapalım:

```
telnet localhost 8888
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET http://www.example.com/ HTTP/1.1

```

Yukarıdaki gibi istek yaptığımızda istek sonuç başlığı ve gövdesi dönecektir:

```
HTTP/1.1 200 OK
Via: 1.1 tinyproxy (tinyproxy/1.10.0-git-17-gcd005a9)
Date: Sun, 29 Dec 2019 15:32:48 GMT
Cache-Control: max-age=604800
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Content-Length: 1256
X-Cache-Lookup: MISS from 212.2.212.122:3129
Content-Type: text/html; charset=UTF-8
Vary: Accept-Encoding
ETag: "3147526947+ident"
X-Cache: HIT
X-Cache: MISS from 212.2.212.122
Expires: Sun, 05 Jan 2020 15:32:48 GMT
Server: ECS (dcb/7EA3)

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
        
    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 2em;
        background-color: #fdfdff;
        border-radius: 0.5em;
        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>    
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

```

Tarayıcımızda proxy/vekil sunucu ayarlarında localhost:8888 yaparak da Internete çıkabiliriz. TinyProxy sununun standart çıktısı yapılan istekleri gösteriyor olacaktır:

```
INFO      Dec 29 18:32:19 [9103]: Initializing tinyproxy ...
INFO      Dec 29 18:32:19 [9103]: Reloading config file
INFO      Dec 29 18:32:19 [9103]: Setting "Via" header to 'tinyproxy'
INFO      Dec 29 18:32:19 [9103]: listen_sock called with addr = '(NULL)'
INFO      Dec 29 18:32:19 [9103]: trying to listen on host[0.0.0.0], family[2], socktype[1], proto[6]
INFO      Dec 29 18:32:19 [9103]: listening on fd [3]
INFO      Dec 29 18:32:19 [9103]: trying to listen on host[::], family[10], socktype[1], proto[6]
INFO      Dec 29 18:32:19 [9103]: listening on fd [4]
WARNING   Dec 29 18:32:19 [9103]: Not running as root, so not changing UID/GID.
INFO      Dec 29 18:32:19 [9103]: Setting the various signals.
INFO      Dec 29 18:32:19 [9103]: Starting main loop. Accepting connections.
CONNECT   Dec 29 18:32:31 [9103]: Connect (file descriptor 5): 127.0.0.1
CONNECT   Dec 29 18:32:42 [9103]: Request (file descriptor 5): GET http://www.example.com/ HTTP/1.1
INFO      Dec 29 18:32:43 [9103]: No upstream proxy for www.example.com
INFO      Dec 29 18:32:43 [9103]: opensock: opening connection to www.example.com:80
INFO      Dec 29 18:32:48 [9103]: opensock: getaddrinfo returned for www.example.com:80
CONNECT   Dec 29 18:32:48 [9103]: Established connection to host "www.example.com" using file descriptor 6.
INFO      Dec 29 18:32:48 [9103]: Closed connection between local client (fd:5) and remote client (fd:6)

```

HTTP proxy implementasyon için aşağıdaki sorulara bakılabilir:

TODO:

1\) Linux makinenizde tinyproxy çalıştırıp mobil telefonunuzun ağını tinyproxy'den geçirip log'ları inceleyin.

2\) HTTP Proxy yazılması:

{% embed url="<https://www.cs.princeton.edu/courses/archive/spr13/cos461/assignments-proxy.html>" %}

3\) TODO: TinyProxy sunucu koduna ekleme yapılması&#x20;
