-
Notifications
You must be signed in to change notification settings - Fork 0
/
windows-sistemlerde-borularpipe.html
204 lines (177 loc) · 18.4 KB
/
windows-sistemlerde-borularpipe.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="utf-8">
<title> Windows Sistemlerde Borular(PIPE)
</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="HandheldFriendly" content="True" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="author" content="0x656e" />
<meta name="description" content="Windows Sistemlerde İsimli Borular - Named Pipes Pipe neymiş? Kendileri iki process arasında iletişim ve veri aktarımını sağlayan basit ve küçük bir teknolojidir. Processler arası iletişim kurmak için kullanılır. Pek tabii Named Pipes 2 uzak makine arasında da iletişim kurabilir. Aslında PIPE olarak bahsedilen 2 tür alt kategori var fakat bunlardan …" />
<meta name="keywords" content="windows pipes, windows borular, pipe nedir, windows pipes türkçe, işletim sistemi borular, işletim sistemlerinde borular, işletim sistemlerinde pipelar, pipe ne demek">
<meta property="article:tag" content="windows pipes" />
<meta property="article:tag" content="windows borular" />
<meta property="article:tag" content="pipe nedir" />
<meta property="article:tag" content="windows pipes türkçe" />
<meta property="article:tag" content="işletim sistemi borular" />
<meta property="article:tag" content="işletim sistemlerinde borular" />
<meta property="article:tag" content="işletim sistemlerinde pipelar" />
<meta property="article:tag" content="pipe ne demek" />
<link rel="canonical" href="https://enesergun.net/windows-sistemlerde-borularpipe.html"/>
<meta name="description" content=""/>
<!-- og definitions -->
<meta property="og:type" content="article" />
<meta property="og:url" content="https://enesergun.net/windows-sistemlerde-borularpipe.html" />
<meta property="og:title" content="Windows Sistemlerde Borular(PIPE)" />
<meta property="og:description" content="Windows Sistemlerde İsimli Borular - Named Pipes Pipe neymiş? Kendileri iki process arasında iletişim ve veri aktarımını sağlayan basit ve küçük bir teknolojidir. Processler arası iletişim..." />
<meta property="og:image" content="https://w0.peakpx.com/wallpaper/212/918/HD-wallpaper-virtual-world-sunset-80s-landscape-retro-theme-tron.jpg" />
<link rel="stylesheet" href="theme/style.css">
<link href="https://enesergun.net/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Enes Ergün Atom Feed" />
</head>
<body>
<div class="container">
<header class="blog-header">
<h1><a href="https://enesergun.net" class="glitch glow" data-text="Enes Ergün">Enes Ergün</a></h1>
<p> Chaotic Neutral / ISTP-T - 30 lvl rogue - Cyber Security </p>
<nav>
<a href="https://enesergun.net/">INDEX</a>
<a href="https://enesergun.net/archives">ARCHIVES</a>
<a href="https://enesergun.net/categories">CATEGORIES</a>
</nav>
</header>
<div class="post">
<header>
<h1>Windows Sistemlerde Borular(PIPE)</h1>
<p class="date">Written on <time datetime="2023-09-13T22:00:00+03:00">Sep 13, 2023</time></p>
</header>
<article>
<h1>Windows Sistemlerde İsimli Borular - Named Pipes</h1>
<h2>Pipe neymiş?</h2>
<p>Kendileri iki process arasında iletişim ve veri aktarımını sağlayan basit ve küçük bir teknolojidir. Processler arası iletişim kurmak için kullanılır. Pek tabii <strong>Named Pipes</strong> 2 uzak makine arasında da iletişim kurabilir. Aslında PIPE olarak bahsedilen 2 tür alt kategori var fakat bunlardan bizi ilgilendiren en geniş kapsamlısı olan <strong>Named Pipes</strong>dır.</p>
<ul>
<li>Named Pipes</li>
<li>Anonymous Pipes</li>
</ul>
<p>Burada PIPE’ın çocukluğuna inmeyeceğim. Geçmişim bir çöptür, çöpü karıştıran… tamam tamam. </p>
<p>PIPE aslında temelinde Windows sistemlerde <strong>FILE_OBJECT</strong> objesidir ve kendisine ait NPFS(Named Pipe File System) dosya sistemi bulunur. Aslında bu konuda PIPE’lara erişim de, dosyaya erişim kadar basit düzeylere indirilebilir. </p>
<ul>
<li>Server tarafında Named pipe oluşturmak için WinAPI’nin <strong>CreateNamedPipe</strong> fonksiyonu kullanılır. Bağlantıları beklemek veya kabul etmek için ise <strong>ConnectedNamedPipe</strong> fonksiyonundan yararlanılır.</li>
<li>Client tarafında ise normal dosya açarmış gibi <strong>CreateFile</strong> veya <strong>CallNamedPipe</strong> fonksiyonları kullanılmaktadır.</li>
</ul>
<p><strong>CreateNamedPipe</strong> </p>
<div class="highlight"><pre><span></span><code><span class="n">HANDLE</span><span class="w"> </span><span class="nf">CreateNamedPipeA</span><span class="p">(</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">LPCSTR</span><span class="w"> </span><span class="n">lpName</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">DWORD</span><span class="w"> </span><span class="n">dwOpenMode</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">DWORD</span><span class="w"> </span><span class="n">dwPipeMode</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">DWORD</span><span class="w"> </span><span class="n">nMaxInstances</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">DWORD</span><span class="w"> </span><span class="n">nOutBufferSize</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">DWORD</span><span class="w"> </span><span class="n">nInBufferSize</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">DWORD</span><span class="w"> </span><span class="n">nDefaultTimeOut</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">,</span><span class="w"> </span><span class="n">optional</span><span class="p">]</span><span class="w"> </span><span class="n">LPSECURITY_ATTRIBUTES</span><span class="w"> </span><span class="n">lpSecurityAttributes</span><span class="w"></span>
<span class="p">);</span><span class="w"></span>
</code></pre></div>
<p><strong>CallNamedPipe</strong></p>
<div class="highlight"><pre><span></span><code><span class="n">BOOL</span><span class="w"> </span><span class="nf">CallNamedPipeA</span><span class="p">(</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">LPCSTR</span><span class="w"> </span><span class="n">lpNamedPipeName</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">LPVOID</span><span class="w"> </span><span class="n">lpInBuffer</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">DWORD</span><span class="w"> </span><span class="n">nInBufferSize</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">out</span><span class="p">]</span><span class="w"> </span><span class="n">LPVOID</span><span class="w"> </span><span class="n">lpOutBuffer</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">DWORD</span><span class="w"> </span><span class="n">nOutBufferSize</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">out</span><span class="p">]</span><span class="w"> </span><span class="n">LPDWORD</span><span class="w"> </span><span class="n">lpBytesRead</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">[</span><span class="n">in</span><span class="p">]</span><span class="w"> </span><span class="n">DWORD</span><span class="w"> </span><span class="n">nTimeOut</span><span class="w"></span>
<span class="p">);</span><span class="w"></span>
</code></pre></div>
<p>Ref: </p>
<p><a href="https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipes">https://learn.microsoft.com/en-us/windows/win32/ipc/named-pipes</a></p>
<p>Ee tamam PIPE serverı oluşturduk. Client ile uzağa bağlanacağız diyelim. Bağlantı nasıl olacak? Aklınıza bir şey geliyor mu? Aslında cevabı çok basit biz uzak bir isimli boruya bağlanacaksak eğer bu işlem SMB üzerinden oluyor. Yani temelde SMB üzerinden bağlantı olduğu için aslında bir SMB’nin bize sunduğu tüm Authentication metodlarını kullanabiliriz. Yani bu Authentication işlemini network üzerinden (Network Authentication) SMB üstlenir. Bu sebeple de aslında tıpkı SMB gibi borulara yapılan bağlantılarda, tıpkı normal file system gibi CreateFile gibi fonksiyonları görürüz. </p>
<h2>Allah’ın Borusunun Modları</h2>
<p>Bu kısma bu şekilde isim vermemin sebebi aslında temelde basit bir düzene sahip olsa bile gevurlar bu işin detayını düşünüp borulara 2 adet mesaj iletim modu eklemelerinden dolayıdır. </p>
<p>Neymiş bu 2 mesaj iletim modu:</p>
<ol>
<li>Byte Mod</li>
<li>Message Mod</li>
</ol>
<h3>Byte Mod</h3>
<p>Kısaca bu mod, eğer gönderilen ve alınan verinin boyutu bilinmiyorsa veya tahmin edilemiyorsa kullanılıyor. Bu modda veri stream edilecek şekilde kullanılır.</p>
<h3>Message Mod</h3>
<p>Bu modda ise gönderilen ve alınan veri bilinen bir veri boyutuna sahipse kullanılmaktadır. Pek tabii veri boyutunu aşan bir durum olursa bunu partlara/partionlara ayırmak yerine <strong>234 (0xEA, ERROR_MORE_DATA)</strong> hatası vermektedir.</p>
<p>Diğer hatalar ve ref. için:</p>
<p><a href="https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-">https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-</a></p>
<p><strong>Önemli Not</strong>: Boruları eğer OVERLAP yapısında oluşturmamışsanız borularda yapılan tüm işlemler <strong>senkron</strong> olarak yapılacaktır. Eğer <strong>asenkron</strong> bir şekilde işlem yapmak isterseniz OVERLAPED bir biçimde işlemler yapabilmek için <strong>FILE_FLAG_OVERLAPPED</strong> değerinin CreateNamedPipe fonksiyonunda belirtilmesi gerekmektedir.</p>
<p>Detaylı bilgi için:</p>
<p><a href="https://learn.microsoft.com/en-gb/windows/win32/ipc/synchronous-and-overlapped-input-and-output">https://learn.microsoft.com/en-gb/windows/win32/ipc/synchronous-and-overlapped-input-and-output</a></p>
<p><a href="https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-overlapped">https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-overlapped</a> </p>
<h3>Blocking Mod</h3>
<p>Yukarıdaki iletişim metodlarından farklı olarak önemli nota istinaden bu başlık girilmiştir. Aslında notla büyük bir bağlantısı vardır. Blocking mode içerisinde 2 adet ana başlık/ayar vardır. Bunlar:</p>
<ol>
<li>PIPE_WAIT: İletişim sağlanırken, veri aktarılırken veya okunurken boru iletişimin tamamlanmasını bekler. </li>
<li>PIPE_NOWAIT: İletişim sağlanırken, veri aktarılırken veya okunurken boru iletişimin tamamlanmasını beklemeden callback döner. Eğer bu mod kullanılıyorsa verinin okunması veya yazılmasının tamamlandığından emin olmak/kontrolünü sağlamak gerekmektedir. </li>
</ol>
<h3>Gelen, Giden Buffer</h3>
<p>Bu başlık tıpkı viral olan aşağıdaki tirad gibidir.</p>
<p><a href="https://www.youtube.com/watch?v=xcmuBXAzwGc">https://www.youtube.com/watch?v=xcmuBXAzwGc</a></p>
<p>Borular yapıları gereği diskte tutulmazlar. Yani geçici veri taşırlar. Bu sebeple bizim yazdığımız okuduğumuz veriler <strong>non-paged memory'i</strong> kullanır. Bu sebepledir ki konunun başında belirttiğimiz gibi boruları oluştururken verdiğimiz buffer boyutları önemlidir. </p>
<p>Vereceğimiz bufferSizelar bizim ne kadar veri okuyabileceğimizi veya yazabileceğimizi belirtir. Burada belirtilen değerlerin dışına çıkılırsa sistem üzerinde hataya veya borular üzerinde gecikmeye sebebiyet verebilir. </p>
<p>Windows’un x64 sistemlerinde en yüksek olabilecek bufferSize işletim sistemine bağlı olarak 4gb kadarcıktır. Eğer bufferSize 0 olarak verilirse işletim sistemi akıllıdır bunu anlar ve sizin aslında minimum veriye ihtiyacınız olduğunu düşünür. Bu sebeple gelen veriyi kontrol eder ve buna göre bir bufferSize ayırır fakat bu da ekstra maliyet demektir. Çünkü gelen veriyi kontrol et → bufferı genişler → veriyi kabul et akışı oluşur. Bu sebeple sunucu ve istemci(client) arasında gecikmeye sebebiyet verir.</p>
<h2>Boruların Güvenliği</h2>
<p>Başlık biraz “anamın ruhunu ortaya koyuyorum (JoJo)” gibi oldu ama kusura bakmayın artık. İşin çokomelli yerine geldik. </p>
<p>Yukarıda da linkini vermiştim diye hatırlıyorum ama boruları oluştururken kullandığımız, windows structure’ına aşağıdan ulaşabilirsiniz. </p>
<p><a href="https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createnamedpipea">https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createnamedpipea</a></p>
<p>Konu boruları oluşturmaya gelince aslında elimizde çok fazla bir seçeneğimiz yok. Yukarıdaki linke bakarsanız eğer (bakın bir zahmet) aşağıdaki tanımlamayı görebilirsiniz.</p>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="n">in</span><span class="p">,</span><span class="w"> </span><span class="n">optional</span><span class="p">]</span><span class="w"> </span><span class="n">LPSECURITY_ATTRIBUTES</span><span class="w"> </span><span class="n">lpSecurityAttributes</span><span class="w"></span>
</code></pre></div>
<p>Buradaki değerin <strong>optional</strong> olduğunu görüyoruz. Boruyu yani PIPE’ı oluştururken ilgili değer eğer değer vermemişsek <strong><em>*</em></strong><em>NULL</em><strong><em>*</em></strong> olarak tanımlanacaktır fakat ilgili değer default olarak ACL’lerde belirtilen “default security descriptor” ile tanımlanacaktır. Bu da LocalSystem kullanıcılarına, boruyu oluşturana, yöneticilere full control vermekle birlikte herkese de read yetkisi verecektir. </p>
<p>Bu sebeple ilgili flaglerin güvenli bir şekilde verilmesi önem arz etmektedir. Düzgün verilmeyen sistemler “Impersonation” ataklarına izin vermektedir.</p>
<p>İlgili ataklarla alakalı daha detaylı bilgi:</p>
<p><a href="https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation">https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation</a></p>
<p>Eveet bu yazının da sonuna geldik ama bu yazıyı tek başına burada tutmak istemiyorum. Bu yazıyı diğer işletim sistemleri ve windows özelinde “İşletim Sistemleri Arası İletişim Serisi” haline getirmeyi düşünüyorum.</p>
<p>Şimdilik not aldığım konular aşağıdaki gibi:</p>
<p>1- Named Pipes</p>
<p>2- RPC</p>
<p>3- WMI</p>
<p>Velhasıl kelam yine yazı sonu şarkı önerisiyle sizlere veda ediyorum. Esen kalın.</p>
<p><a href="https://www.youtube.com/watch?v=b_S732Wl1cA" title="I don't have money"><img alt="I don't have money" src="https://i.ytimg.com/vi/b_S732Wl1cA/maxresdefault.jpg"></a></p>
<h2>Referanslar</h2>
<p><a href="https://blog.stephencleary.com/2010/03/io-limitation-in-windows.html">https://blog.stephencleary.com/2010/03/io-limitation-in-windows.html</a></p>
</article>
<footer>
<p>This entry is posted in <a href="https://enesergun.net/category/windows.html">windows</a>.</p>
</footer>
<div class="comments">
<div id="disqus_thread"></div>
<script type="text/javascript">
var disqus_shortname = '0x656e';
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
</div>
</div>
<footer class="blog-footer">
<ul class="nav">
<li><a href="https://devilinside.me/"> Eşelyon</a></li>
<li><a href="https://medium.com/@brkalbyrk"> Berk Albayrak</a></li>
<li><a href="https://ahmtglr.wordpress.com/"> Ahmet Güler</a></li>
<li><a href="https://kaganisildak.com/"> Kağan Işıldak</a></li>
<li><a href="https://eybisi.run/"> Eybisi</a></li>
<li><a href="https://onur.im/"> Onur Aslan</a></li>
<li><a href="https://canyoupwn.me/"> Canyoupwn.me</a></li>
<li><a href="https://www.oguzozkeroglu.com"> Oğuz Özkeroğlu</a></li>
<li><a href="https://aligoren.com"> Ali Gören</a></li>
<li><a href="https://0xf61.gitlab.io/"> Emir Kurt</a></li>
<br>
<li><a href="www.twitter.com/eness_ergun">Twitter</a></li>
<li><a href="[email protected]">Mail</a></li>
</ul>
<p class="disclaimer">
Built with <a href="http://getpelican.com">Pelican</a>, and <a href="https://github.com/ka1nsha/MBPelican">MB Pelican</a> theme.
</p>
</footer>
</div>
</body>
</html>