Proxy Türleri ve Charles Web Proxy

Cem Topkaya
12 min readOct 8, 2020

--

  • Protokol Nedeniyle Farklı Proxy Türleri
  • HTTP Proxy
  • HTTPS Proxy (HTTP + SSL = HTTPS)
  • SOCKS Proxy (SOCKet Secure)
  • Charles, Putty, SSH İle Proxy Uygulamaları
  • Charles ile HTTP Proxy Uygulaması
  • Charles ile HTTP Vekaleti SOCKS Üstünden SSH Tünele Yönlendirmek
  • Putty ile SSH Tünel ve SOCKS Proxy
  • cUrl Proxy Argümanları
  • cUrl Sorgularını Proxy Sunucu Üstünden Çalıştırma
  • SOCKS Proxy Üstünden cUrl ile Sorgu Çalıştırma
  • Charles Nasıl Vekalet Ediyor?
  • SSH Tünelin SOCKS Vekil Sunucusunu Kimlik Doğrulama ile Başlatmak
  • curl ile SOCKS Proxy Üstünden Kendinde İmzalı Sertifika Otoritesinden Üretilmiş İstemci Sertifikası Olan Bir Siteye SSL Hatası Almadan İstek Yapabilmek
  • Charles İle SOCKS Vekilin Arasına Girmek
  • Birden Fazla DNS ve IP için Aynı Sertifikayı Kullanabilmek

Charles ile https isteklerinin arasına girip içeriği okumak üstüne yaptıklarımı not ediyorum. Bu sayede mümkün olursa POSTMAN, INSOMNIA gibi araçları http/2 çalışan sunucularla konuşturabilir miyim diye bakacağım.

Öncelikle Charles bir kaç proxy çalışma prensibine hizmet ediyor. Vekalet tipleri için bu videoyu izlemek isteyebilirsiniz.

Vekil sunucular sizin ile istek yaptığınız sunucular arasındaki aradaki sunuculardır.

Protokol nedeniyle farklı proxy türleri

  • HTTP Proxy
  • HTTPS Proxy (SSL Proxy)
  • SOCKS proxy

Anonimlik seviyesine göre farklı proxy türleri:

  • Transparent Proxy
  • Anonymous Proxy

Verilerin değiştirilmesine dayalı proxy türleri:

  • Forward proxy
  • Reverse proxy

Protokol Nedeniyle Farklı Proxy Türleri

HTTP Proxy

HTTP proxy, web sunucusuna veya istemciye (tarayıcı) bağlanmak için HTTP kullanan herhangi bir proxy sunucusudur. İnternette HTTP’nin yaygın kullanımı nedeniyle, proxy’lerin çoğu HTTP proxy’leridir.

Bu proxy’ler internette gezindiğiniz web sayfalarına erişebilir. Güvenli HTTP (HTTPS) kullanarak web sitelerine de erişebilmelerine rağmen, maliyet, işlem sırasında orijinal SSL Sertifikasını kaybediyor.

HTTP bağlantısı verileri SOCKS protokolünden daha kolay yorumlayabildiğinden, botlar ve kazıyıcılar HTTP proxy’leriyle daha iyi performans gösterir.

HTTPS Proxy (HTTP + SSL = HTTPS)

Verilerin sizin bilgisayarınızdan ziyaret ettiğiniz sitenin bilgisayarına giderken şifrelenmesi için SSL (yeni adıyla TLS) kullanıyoruz. Yani sizin verilerinizi bir bilgisayardan bir başkasına taşıyabilmek için HTTP yi açık metin halinde götürürken bu verinin şifrelenmesi için şimdilerde 1.2 versiyonu kullanılan TLS sayesinde bir şifreleme düzeneğinin bilgisayarlar arasından alınıp verildiği, verilerin şifrelendiği sistemi işleterek HTTPS protokolünü bize sunar.

SSL veya Güvenli Yuva Katmanı, HTTP’yi HTTPS yapmak için uygulanan ek bir güvenlik katmanıdır. Bu katman, veri aktarımı sırasında gizli dinlemeyi önlemek için uçtan uca şifreleme için kullanılan güvenlik sertifikalarını ekler.

SSL ile donatılmış bir proxy sunucusu, herhangi bir dış müdahaleyi önlemek için istemciye ve ayrıca web sunucusuna güvenli bir bağlantı kurar. HTTPS Proxy’leri, kullanıcı adı ve parola kullanarak işlem yaparken veya web sitelerinde oturum açarken güvende kalmanıza yardımcı olur.

SOCKS Proxy (SOCKet Secure)

SOCKet Secure, bir istemci adına ağ trafiğini gerçek sunucuya yönlendirerek bir güvenlik duvarı üzerinden sunucularla iletişimi kolaylaştıran bir ağ protokolüdür. SOCKS, herhangi bir protokol veya program tarafından üretilen her tür trafiği yönlendirmek için tasarlanmıştır.

Bir SOCKS proxy sunucusu, istemci adına güvenlik duvarının arkasındaki başka bir sunucuya bir TCP bağlantısı oluşturur, ardından istemci ile gerçek sunucu arasında ağ paketlerini değiştirir. SOCKS proxy sunucusu, istemci ile sunucu arasındaki ağ trafiğini hiçbir şekilde yorumlamaz; Genellikle, istemciler bir güvenlik duvarının arkasında olduğundan ve bunu SOCKS proxy sunucusu aracılığıyla yapmadıkları sürece dış sunuculara TCP bağlantıları kurmalarına izin verilmediğinden kullanılır. Bu nedenle, bir SOCKS proxy’si bir kullanıcının TCP ve UDP oturumunu güvenlik duvarı üzerinden aktarır.

OSI Modelinde 5. Katmana dikkat!

SOCKS, 5. katman protokolüdür ve OSI modelinde bu katmanın altındaki hiçbir şeyi umursamaz (bu, katman 5'in altında çalışan protokolleri tünellemek için kullanamayacağınız anlamına gelir). SOCKS, SSL (katman 7) ve TCP/UDP (katman 4) arasında 5. katmana oturduğundan, HTTP, HTTPS, POP3, SMTP ve FTP dahil olmak üzere çeşitli istek türlerini işleyebilir. Sonuç olarak, SOCKS e-posta, web’de gezinme, eşler arası paylaşım, dosya aktarımları ve daha fazlası için kullanılabilir.

İstemci ile sunucu arasındaki HTTP veya HTTPS trafiğini yorumlamak ve iletmek için kullanılan bir HTTP proxy’si gibi, 7. katmanda belirli protokoller için oluşturulan diğer proxy’ler, genellikle uygulama proxy’leri olarak adlandırılır.

SOCKS Proxies, trafiği yönlendirmek için istemci adına bir TCP bağlantısı oluşturur. Bu, güvenlik duvarları üzerinden tünel açma yöntemidir ve proxy sunucusu bile verileri yakalayamaz.

Biraz daha açalım durumu»

  • Diyelim bilgisayarınızın IP adresi 10.10.10.10 ve erişmek istediğiniz adres http://50.50.50.50 olsun. Bu 50'li IP bloğuna erişiminiz de yooook ;)
  • Bir başka bilgisayarın ise (diyelim ki 20.20.20.20 IPli olsun) hem 30 hem 50 li bloğa erişebilsin ama 40 lı bloğa erişemesin. Ve farz edelim ki siz bu 20 li makineye SSH ile bağlanabiliyorsunuz.
  • ssh -D 4500 kullanıcı_adı@20.20.20.20 komutuyla SSH bağlantısı sağlayıp firefox seçeneklerinizden proxy (vekil) ayarlarında manual proxy seçeneği, SOCKS5, sunucuya kendi bilgisayarınızı (localhost) ve port olarak 4500 yazabilirsiniz.

Olan şey ise aşağıdaki grafikteki gibidir. SSH tüneli bilgisayarınızla uzak sunucu arasına kurduktan sonra internet gezgininize SOCKS proxy bağlantısı kurarak HTTP isteklerinizi bu tünele yönlendirebilirsiniz. Tünele düşen istek uzak sunucuya gelir ve doğrudan hedefe yönlendirilir. SSH Tünel içinden geçtiği için kimse bu akışı dinleyemez.

SOCKS 4 TCP desteklerken SOCKS 5 ayrıca UDP protokolünü de destekler, bu nedenle SOCKS proxy çok daha fazla uygulamayı destekler.

ssh -D 4500 kullanıcı_adı@20.20.20.20 komutuna ek olarak:

  • -N uzak komutları çalıştırmayın, sadece portları iletmek için kullanışlıdır
  • -C tüneldeki verileri sıkıştırıp bant genişliğinden tasarruf edin
  • -q sessiz mod, yerel olarak herhangi bir çıktı üretmez
  • -f (fork kelimesinin kısaltması olup arka plan komutunu çatallamak)arka planda çalışmasını tercih ediyorsanız kullanmalısınız
Biraz daha detaylı öğrenmek isterseniz

Charles, Putty, SSH İle Proxy Uygulamaları

Charles ile HTTP Proxy Uygulaması

Charles ile HTTP Vekaleti SOCKS Üstünden SSH Tünele Yönlendirmek

cUrl Proxy Argümanları

vekil sunucu ayarlarınızı saklayabilirsiniz. http_proxy’nin küçük harf olduğunu, diğer ikisinin büyük harf olduğunu unutmayın.

http_proxy=socks5h://localhost:8001
HTTPS_PROXY=socks5h://localhost:8001
ALL_PROXY=socks5h://localhost:8001 PROGRAM [OPTION]...

Kalıcı olarak cUrl uygulamasının vekil sunucu ayarlarını .curlrc dosyasından okuyabilir. Bu dosyayı

  • Windows için echo %APPDATA% ile gördüğünüz dizine kaydetmenizgerek örneğin: C:\Users\<kullanıcınız>\AppData\Roaming dizininin altında _curlrc adında,
  • Linux altında ev dizininde (cd ~) .curlrc dosya adıyla kaydedeceğiz
  • Dosyanın içeriği proxy="http://user:pwd@127.0.0.1:1234" şeklinde olacak

Hata giderme

C:\Users\cem.topkaya>curl --help | grep proxy
--noproxy <no-proxy-list>
Proxy kullanmayan ana bilgisayarların listesi
--preproxy [protokol://]host[:port]
Önce bu proxy'yi kullanın
-x, --proxy [protokol://]host[:port]
Bu proxy'yi kullanın
protokoller: http, https, socks4a, socks4, socks5, socks5h
--proxy-anyauth
Herhangi bir proxy kimlik doğrulama yöntemi seçin
--proxy-basic
Proxy üzerinde Temel kimlik doğrulamasını kullan
--proxy-cacert <file>
Yetkili sunucuya karşı eş doğrulamak için CA sertifikası
--proxy-capath <dir>
proxy için eş doğrulamak için CA dizini
--proxy-cert <cert[:passwd]>
Proxy için istemci sertifikasını ayarlayın
--proxy-cert-type <tür>
HTTS proxy'si için istemci sertifika türü
--proxy-ciphers <list>
Proxy için kullanılacak SSL şifreleri
--proxy-crlfile <file>
Proxy için bir CRL listesi ayarlayın
--proxy-digest
Proxy üzerinde Özet kimlik doğrulamasını kullanın
--proxy-header <header/@file>
Özel üstbilgileri proxy'ye iletin
--proxy-insecure
Proxy'yi doğrulamadan HTTPS proxy bağlantılarını yapın
--proxy-key <key>
HTTPS proxy'si için özel anahtar
--proxy-key-type <tür>
Proxy için özel anahtar dosya türü
--proxy-negotiate
Proxy üzerinde HTTP Pazarlık (SPNEGO) kimlik doğrulamasını kullanın
--proxy-ntlm
Proxy üzerinde NTLM kimlik doğrulamasını kullanın
--proxy-pass <phrase>
HTTPS proxy'si için özel anahtar için parola dizgesi
--proxy-service-name <ad>
SPNEGO proxy hizmet adı
--proxy-ssl-allow-beast
HTTPS proxy'si için birlikte çalışma için güvenlik açığına izin ver
--proxy-tlsauthtype <tür>
HTTPS proxy'si için TLS kimlik doğrulama türü
--proxy-tlspassword <string>
HTTPS proxy'si için TLS şifresi
--proxy-tlsuser <name>
HTTPS proxy'si için TLS kullanıcı adı
--proxy-tlsv1
HTTPS proxy için TLSv1 kullanın
-U, --proxy-user <kullanıcı: parola>
Proxy kullanıcısı ve parolası
--proxy1.0 <host[:port]>
Verilen bağlantı noktasında HTTP / 1.0 proxy kullan
-p, --proxytunnel
Bir HTTP proxy tüneli aracılığıyla çalıştırın (CONNECT kullanarak)
--socks4 <host[:port]>
Verilen ana bilgisayar + bağlantı noktasında SOCKS4 proxy'si
--socks4a <host[:port]>
Verilen ana bilgisayar + bağlantı noktasında SOCKS4a proxy
--socks5 <host[:port]>
Verilen ana bilgisayar + bağlantı noktasında SOCKS5 proxy'si
--socks5-gssapi-service <ad>
GSS-API için SOCKS5 proxy hizmet adı
--socks5-hostname <host[:port]>
SOCKS5 proxy, ana bilgisayar adını proxy’ye geçir
--suppress-connect-headers
Proxy CONNECT yanıt üstbilgilerini bastır

cUrl Sorgularını Proxy Sunucu Üstünden Çalıştırma

Charles’ı SOCKS Proxy olarak çalıştırıyoruz:

Aşağıdaki cUrl ifadesinin ayrıntısını biraz daha aşağıda yazıyor olacağım ama önce bir göz atalım nasıl olduğuna.

curl -x "socks5://127.0.0.1:5000" "http://httpbin.org/ip"
  • Charles’ı SOCKS protokolüyle çalışabilen vekil sunucu olarak araya sokuyoruz.
  • cUrl ifademize “http://httpbin.org/ip” isteğimizi SOCKS vekil sunucu üstünden göndermek istediğimizi söyledik
  • Hem Charles üstünde hem cUrl komutu sonucunda görüyoruz.

SOCKS Proxy Üstünden cUrl ile Sorgu Çalıştırma

Aşağıdaki doğrudan curl komutu ile istek yaptığımız adres bilgisayarımızın internete ulaştığı IP adresini verir.$ curl "http://httpbin.org/ip"
cUrl eğer bir proxy üstünden çalışırsa bu kez internete eriştiği IP adresi vekil sunucunun IP adresi olacaktır
$ curl -x "socks5://127.0.0.1:5000" "http://httpbin.org/ip"Eğer bir kullanıcı doğrulaması varsa proxy'nin üstünde:$ curl -x "socks5://kullanici_adi:sifresi@127.0.0.1:6000" "http://httpbin.org/ip"

Transparent Proxy

Normal Vekil Sunucu

Ön bellekleme (caching), web isteklerini süzme (web filtering) veya gateway sunucular olarak çalışan, istemci olan size bir ayar yaptırtmayan vekil sunuculara Transparent Proxy Server denir. Siz farkında olmadan şirketinizde sizin haberiniz olmadan tüm istekleriniz bir şeffaf vekil sunucu üstünden akıyor, bu veriler günlükleniyor olabilir. Bu proxy’ler istenen veya yanıtlanan verileri değiştirmez, bu nedenle anonimlik söz konusu değildir ve web siteleri IP adresinizi okuyabilir.

Transparent proxies are also termed as intercepting proxy, inline proxy, or forced proxy.

Transparent Proxy Server

Reverse proxy

Reverse proxy en çok güvenlik amaçlı kullanılır. Aşağıdaki gösterimde bir App Server, bir Database Server var. Dış dünyadan bu sunuculara doğrudan erişim sağlayamasınlar diye önlerine Reverse Proxy Server koyup, gelen istekleri portlarına bakarak arkasındaki sunuculara yönlendiriyor. Böylece dış dünya, korumak istediğimiz sunucuların IP bilgilerini hiç bilmiyor olacaklar.

Reverse Proxy

Charles Nasıl Vekalet Ediyor?

Önce charles’ın sertifikasını bilgisayara yükleyeceğiz. Böylece istemci ile kendi sertifikası üstünden konuşsun, sunucuylada sunucudan gelen sertifika üstünden konuşsun. Bir nevi hem Almanca hem Fransızca bilen bir Türk çevirmenin her ikisinin arasında (man-in-middle) söylediklerini bilip ve aktarması gibi.

SSH Tünelin SOCKS Vekil Sunucusunu Kimlik Doğrulama ile Başlatmak

Böyle bir özellik yokmuş ama Dante diye bir uygulama buna imkan veriyormuş.

curl ile SOCKS Proxy Üstünden Kendinde İmzalı Sertifika Otoritesinden Üretilmiş İstemci Sertifikası Olan Bir Siteye SSL Hatası Almadan İstek Yapabilmek

Öncelikle komut şu:

curl -vvv  --socks5-hostname 127.0.0.1:5000 https://10.10.31.111:8103/nssf-settings/v1/db --cacert ca-crt.crt

---v Her adımı tek tek anlatsın

--socks4 / --socks4a / --socks5 / -socks5-hostname Hangi SOCKS vekil üstünden curl isteğimizi yapmak istediğimizi belirtiriz. Kendi makinemizde (localhost veya 127.0.0.1) açık bir SOCKS hizmeti mevcut ve bu hizmet 5000 port’undan verilmekte. ssh.exe Uygulaması aynı zamanda açtığı Secure Shell (SSH) tünelini başka uygulamalar için SOCKS Proxy olarak kullandırabilir. Bunun için ssh -D 5000 uzakMakineKullaniciAdi@UzakMakineAdresi şeklinde bir komut çalıştırılması yeterlidir.

https://10… ile SOCKS Vekilinin erişebileceği bir adresi veriyoruz.

--cacert Argümanına vereceğimiz değer ile https://10… adresine kurulacak güvenli soket katmanını (Secure Socket Layer) şifrelemede kullanılacak sertifikayı imzalayan Sertifika Otoritesine (Certificate Authority) ait sertifikanın umuma açık olanını (public) veriyoruz. Böylece sertifikayı tanıyamadım hatasını almamak için -k anahtarını kullanmamıza gerek kalmaz

curl: (60) SSL certificate problem: unable to get local issuer certificate

Eğer CA’nın açık sertifikasını veremezsek -k anahtarıyla “sertifikaları doğrulamaktan vazgeç, gelen sertifika ne ise ona güven” diyebiliriz.

curl --help all | grep insecure

Charles İle SOCKS Vekilin Arasına Girmek

Bu kez Charles içinde harici bir vekil üstünden gideceğimizi aşağıdaki gibi belirtiriz.

  1. Proxy > External Proxy Settings > SOCKS Proxy > SOCKS Proxy Server: localhost:5000
  2. SSL Proxy Olarak Charles çalıştırılır
  3. İstek bu kez http proxy olarak çalışan Charles üstünden yapılır:
curl -vvv --proxy 127.0.0.1:8888 https://10.10.31.111:8103/nssf-settings/v1/db -k

Sertifika üretip bir sunucuda kullanmak kısmı için bu adres (https://engineering.circle.com/https-authorized-certs-with-node-js-315e548354a2)

Özetle komutlaR:

# CA Sertifikası
openssl genrsa -out server-key.pem 4096
wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnfopenssl req -new -x509 -days 9999 -config ca.cnf -keyout ca-key.pem -out ca-crt.pem
# Sunucu Sertifikası
openssl genrsa -out server-key.pem 4096wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnfopenssl req -new -config server.cnf -key server-key.pem -out server-csr.pemopenssl x509 -req -extfile server.cnf -days 999 -passin "pass:password" -in server-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out server-crt.pem# İstemci Sertifikası
openssl genrsa -out client1-key.pem 4096
wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/client1.cnfopenssl req -new -config client1.cnf -key client1-key.pem -out client1-csr.pemopenssl x509 -req -extfile client1.cnf -days 999 -passin "pass:password" -in client1-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out client1-crt.pem

Birden Fazla DNS ve IP için Aynı Sertifikayı Kullanabilmek

Eğer birden fazla DNS adına veya IP adresine yapacağınız isteklerde bu sertifikayı kullanmak istiyorsanız -extensions req_ext parametresini eklemeniz gerekiyor. Tabi bu parametrenin gereği olarak client.cnf dosyasında aşağıdaki değişiklikleri yapmanız gerekiyor:

[ req_ext ]
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.cem.com.tr
DNS.2 = localhost
IP.1 = 127.0.0.1
IP.2 = 10.10.31.111
!!! DİKKAT !!!openssl x509 -req -extfile client1.cnf -extensions req_ext -days 999 -passin "pass:password" -in client1-csr.pem -CA ca-crt.pem -CAkey ca-key.pem -CAcreateserial -out client-crt.pemArtık oluşan sertifika dosyasını doğrulamak için aşağıdaki komutu çalıştıralımopenssl verify -CAfile ca-crt.pem client1-crt.pem

CN bilgilerinin çalışacağı URL ile eşleşmesine dikkat edin

# ca.cnf
[ ca ]
default_ca = CA_default
[ CA_default ]
serial = ca-serial
crl = ca-crl.pem
database = ca-database.txt
name_opt = CA_default
cert_opt = CA_default
default_crl_days = 9999
default_md = md5
[ req ]
default_bits = 4096
days = 9999
distinguished_name = req_distinguished_name
attributes = req_attributes
prompt = no
output_password = password
[ req_distinguished_name ]
C = US
ST = MA
L = Boston
O = Example Co
OU = techops
CN = ca
emailAddress = certs@example.com
[ req_attributes ]
challengePassword = test
# client1.cnf
[ req ]
default_bits = 4096
days = 9999
distinguished_name = req_distinguished_name
attributes = req_attributes
prompt = no
x509_extensions = v3_ca
[ req_distinguished_name ]
C = US
ST = MA
L = Boston
O = Example Co
OU = techops
CN = 10.10.31.111
emailAddress = certs@example.com
[ req_attributes ]
challengePassword = password
[ v3_ca ]
authorityInfoAccess = @issuer_info
[ issuer_info ]
OCSP;URI.0 = http://ocsp.example.com/
caIssuers;URI.0 = http://example.com/ca.cert

Sunucu:

var fs = require('fs'); 
var https = require('https'); var options = {
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-crt.pem'),
ca: fs.readFileSync('ca-crt.pem'),
requestCert: true,
rejectUnauthorized: true
}; https.createServer(options, function (req, res) {
console.log(new Date()+' '+
req.connection.remoteAddress+' '+
req.socket.getPeerCertificate().subject.CN+' '+
req.method+' '+req.url);
res.writeHead(200);
res.end("hello world\n");
}).listen(4433);

İstemci:

var fs = require('fs'); 
var https = require('https'); var options = {
hostname: 'localhost',
port: 4433,
path: '/',
method: 'GET',
key: fs.readFileSync('client1-key.pem'),
cert: fs.readFileSync('client1-crt.pem'),
ca: fs.readFileSync('ca-crt.pem') }; var req = https.request(options, function(res) {
res.on('data', function(data) {
process.stdout.write(data);
});
}); req.end(); req.on('error', function(e) {
console.error(e);
});

--

--

Cem Topkaya
Cem Topkaya

Written by Cem Topkaya

Evlat, kardeş, ağabey, eş, baba, müzik sever, öğrenmek ister, paylaşmaya can atar, iyi biri olmaya çalışır, hakkı geçenlerden helallik ister vs.

No responses yet