Socks Proxy

Socksun açılımı Socket Secure demektir.

Socks, proxylerin kullandığı bir protokoldür.

Proxy kelime anlamıyla vekil demektir. Proxydeki mantık, clientın servera erişirken vekil sunucu üzerinden bağlantı kurmasıdır.

Socks proxy sadece spesifik bir protokole hizmet etmez. Yani Socks proxy http,smtp,ftp gibi bir çok protokol/uygulama için kullanılabilecek generic bir servis protokolü olarak düşünülebilir.

Yaygın olarak kullanılan iki socks sürümü bulunur.  Socks4 ve Socks5.

Socksda temel iki bileşen vardır.  Bunlardan biri socks server (socks proxy), diğeri socks client.

# Socks5 Protocol

socks5 - Socks Proxy

  • 3-ways handshaking gerçekleştirilir.
  • Client desteklenen authentication metotlarını iletir.
    • No authentication olabilir
    • GSSAPI olabilir
    • Username/password olabilir.
  • Sock server kabul edilen authentication metodunu iletir.
  • Client bağlanmak istediği hedef sunucuların bilgilerini iletir.
  • Socks Server bilgilerdeki sunucuya bağlanmaya çalışır. Ve sonucu clienta döner.
  • Sonrasında klasik data paketleri hedefe sock proxy üzerinden iletilir.

# Socks4 Protocol

socks4 - Socks Proxy

  • 3-ways handshaking gerçekleştirilir.
  • Client bağlanmak istediği hedef bilgileri iletir.
  • Socks server hedefe bağlanıp bağlamadığını clienta döner.
  • Sonrasında klasik data paketleri hedefe sock proxy üzerinden iletilir.

# Socks4 vs Socks5

Socks4 de user authentication bulunmazken, Socks5 de user authentication bulunmaktadır.

Socks4 de sadece TCP desteklenirken, Socks5 ile birlikte ek olarak UDP desteği de gelmiştir. DNS gibi UDP konuşan protokoller sock serverla iletişim kurabilir hale gelmiştir.

Socks4de name resolution bulunmaz. Client isim çözme sorgusunu proxye iletmez, kendi tarafında çözer.

Socks4a, socks4ün name resolution yapabilen sürümüdür.

Sock5de name resolution bulunur. Client isterse host bilgisini de proxye iletebilir ve sock serverdan bunu çözmesi istenebilir.

Socks5de ipv6 desteği varken, socks4 de ipv4 desteği bulunmamaktadır.

Socks4 için bir RFC dokümanı bulunmaz, Socks5 için ise üç adet RFC (1928, 1929, 1961) vardır.

# Socks vs HTTP Proxy

Socks proxy herhangi bir protokol için kullanılabilir. HTTP Proxy Server ise HTTP isteklerini iletir.

# Socks Client

Socks proxy istemcisi sistem, browser, browser eklentileri üzerinden ayarlanabilir. Ancak her uygulama socks desteklemeyebilir.

Socks proxy desteği olmayan bir uygulamanın trafiğini socks proxy üzerinden geçirmek için proxyfier, socksify (dante-client)  gibi çok güzel araçlar bulunmaktadır.

# Socks4 Protocol Paket İncelemesi

Örneğin internet free olarak bulduğum bir socks4 proxy server (89.108.146.99:4145) üzerinden gokhankesici.com başlık bilgilerini sorgulayalım. İsteği curl ile yapalım.

> curl --socks4 89.108.146.99:4145 -I https://www.gokhankesici.com

socks4pcap - Socks Proxy

106 nolu pakette giden paket aşağıdaki gibidir. Paketi incelediğimizde sürüm bilgisi, hangi servera ve porta bağlanmak istediğimiz, ve hangi socks komutunu çalıştırdığımız görülmektedir. Burada hedef sunucuya bağlanmak istediğimizden Connect methodu kullanılmıştır. Socks4 de kullanıcı doğrulaması olmadığını belirtmiştik. Bu sebeple boştur.

socks4request - Socks Proxy

108 nolu pakette ise proxy sunucusundan dönen cevabı Results kısmındagörüyoruz. Results yazan byte dışındaki bytelar ise boş olduğundan 0 olarak doldurulmuştur.

socks4response - Socks Proxy

# Socks5 Protocol Paket İncelemesi

Örneğin localime kurduğum socks5 proxy server (192.168.80.199:1080) üzerinden gokhankesici.com başlık bilgilerini sorgulayalım. İsteği curl ile yapalım.

> curl --socks5 192.168.80.199:1080 -I https://www.gokhankesici.com

socks5 1 - Socks Proxy

4 nolu paketi incelediğimizde 3-way handshaking sonrası socks sürüm bilgisi ile birlikte authentication metotlarını iletilmiş.

sock5no4 - Socks Proxy

6 nolu paketi incelediğimizde sock server kabul edilmiş authentication metodu ve sürüm bilgisini iletmiş.

socks5no6 - Socks Proxy

8 nolu paketi incelediğimizde clientımız hedef bağlanma bilgilerini sunucuya iletiyor.

socks5no8 - Socks Proxy

13 nolu paketi incelediğimizde socks server ın yanıtı ve yanıtın nereden geldiği bilgisi görülebilir.

socks5no13 - Socks Proxy

Bu paketten sonra proxy server bind edilen port üzerinden paketleri istemci ve hedef sunucu arasında taşır.

# Socks5-hostname (socks5h) Paket İncelemesi

Socks5 in isim çözdürme işini uzak sunucu da gerçekleştirebileceğinden bahsetmiştik.

Hedef olarak ip yerine domain belirtmek için clientın isteklerini bu şekilde yapması gerekir.  curl de aşağıdakiler gibi belirtebiliyor. Her client desteklemeyebilir.

> curl -x socks5h://192.168.80.199:1080 -I https://www.gokhankesici.com
> curl --socks5-hostname 192.168.80.199:1080 -I https://www.gokhankesici.com

sock5h - Socks Proxy

6 ve 9 nolu pakette socks5 deki gibi bir authentication gerçekleştirilir. 10 nolu pakette ise hedefe ip yerine domain verilir.

socks5hno1 - Socks Proxy

12 nolu pakette ise socks serverımız dns sunucumuza gokhankesici.comu sordu.

21 nolu pakette socks server clienta cevap olarak  başarılı olduğunu ip ile dönmektedir.

socks5hno21 - Socks Proxy

Bu paketten sonra proxy server bind edilen port üzerinden paketleri istemci ve hedef sunucu arasında taşır.

# Socks4a Packet İncelemesi

Sock4a, socks4ün basit bir sürümüdür ve socks5deki sadece name resolutionı sağlar.

> curl -x socks4a://192.168.80.199:1081 -I https://www.gokhankesici.com

socks4a scaled - Socks Proxy

Socks5 paket incelemesinden farklı olarak çıktımızda authentication bölümü bulunmuyor. 4 nolu pakette klasik socks4den farklı olarak domaini görebilirsiniz. Ve remote address kısmının 0.0.0.1 olduğunu görebilirsiniz. 0.0.0.(1-255) arasındakiler socks4a protokolünde remote domaini çözmesi gerekiğini belirtiyor.

socks4ano4 - Socks Proxy

Sonrasında socks4a server gidip dns sorgusu yapar. Sonra hedefe bağlanıp bağlandığını 11 nolu pakette bağlandı bilgisini iletir.

socks4ano11 - Socks Proxy

Bu paketten sonra proxy server bind edilen port üzerinden paketleri istemci ve hedef sunucu arasında taşır.

# HTTP Proxy Paket İncelemesi

HTTP Proxy Sunucumuza aşağıdaki gibi bir istek yapalım.

> curl -x http://192.168.80.199:3128 -I https://www.gokhankesici.com

httpproxy - Socks Proxy

Paket 6 da görüleceği üzere HTTP CONNECT isteği proxy sunucuya iletiliyor. Paketin detayında bağlanması gerektiği yeri ve protokol sürümünü söyler. Proxy-Connection headerı client ve proxy server arasındaki bir header başlığıdır.

httpconnect - Socks Proxy

Sonrasında proxy sunucumuz dns sorgusunu yapar. Ve caching aktifse ns kayıtları da tekrar sorgulamamak için proxy server tarafından kaydedilir.

17 nolu pakette ise http proxy sunucumuzdan bağlanıldı yanıtını yani 200 cevabını döner.

httpproxyresponse - Socks Proxy

Bu paketten sonra proxy server bind edilen port üzerinden paketleri istemci ve hedef sunucu arasında taşır.