OSCP Enumeration full
Eu peguei a fonte abaixo deste repositório:
https://github.com/oncybersec/oscp-enumeration-cheat-sheet/blob/main/README.md
Adicionei algumas poucas coisas só pra fins de evasão e algumas melhorias. Utilizado mais como referência.
PortScan
nmap
Full TCP port scan
sudo nmap -Pn -p- -oN alltcp_ports.txt <hostname>
Full TCP port scan (safe scripts + version detection)
sudo nmap -Pn -sC -sV -p- -oN alltcp.txt <hostname>
Top 20 UDP port scan
sudo nmap -Pn -sU -sV -sC --top-ports=20 -oN top_20_udp_nmap.txt <hostname>
nmap -sU -p 53,161,111,137,139,500,2049 -Pn 10.11.1.0/24
netcat
nc -z -w 1 -n -v 10.11.1.70 500
nc -z -w 1 -n -v 10.11.1.70 500-1000
nc -u -z -w 1 -n -v 10.11.1.70 161
bash pseudo devices
/dev/$protocol/$host/$port
if timeout 5 bash -c '</dev/tcp/kernel.org/443 &>/dev/null'
then
echo "Port is open"
else
echo "Port is closed"
fi
ou
timeout .1 bash -c "echo /dev/tcp/10.11.1.5/80" && echo "port 80 is open"
Legion (gui app)
sudo legion
Proxychains
Top 20 TCP port scan
proxychains nmap -Pn -sT --top-ports=20 --open -oN top_20_tcp_nmap.txt <hostname>
Top 1000 TCP port scan
proxychains nmap -Pn -sT --top-ports=1000 --open -oN top_1000_tcp_nmap.txt <hostname>
Scan TCP ports (safe scripts + version detection)
proxychains nmap -Pn -sT -sC -sV -p 21,22,80 -oN tcp_nmap_sC_sV.txt <hostname>
Autorecon
Scan single target
sudo autorecon -o enumeration
Scan multiple targets
sudo autorecon -o enumeration <hostname>1 <hostname>2 <hostname>3 <hostname>4
Services
FTP
FTP (21/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p 21 --script="banner,(ftp* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" -oN "tcp_21_ftp_nmap.txt" <hostname>
SSH
SSH (22/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p 22 --script=banner,ssh2-enum-algos,ssh-hostkey,ssh-auth-methods -oN tcp_22_ssh_nmap.txt <hostname>
SMTP
SMTP (25/tcp)
Version detection + NSE scripts
nmap -sS -p 25 -n -sV 10.11.1.25
nmap -Pn -sV -p 25 "--script=banner,(smtp* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" -oN tcp_25_smtp_nmap.txt <hostname>
smtp-user-enum
/home/kali/.local/bin/smtp-user-enum -V -m RCPT -w -f '<user@example.com>' -d 'domain.local' -U "/usr/share/metasploit-framework/data/wordlists/unix_users.txt" <hostname> 25 2>&1 | tee "tcp_25_smtp_user-enum.txt"
nc -nv 10.11.1.217 25
#ou
telnet 10.10.10.10 25
VRFY root
VRFY <username>
user <username>
pass <password>
list
retr 1
retr 2
DNS
DNS (53/tcp, 53/udp)
Version detection + NSE scripts
sudo nmap -Pn -sU -sV -p 53 "--script=banner,(dns* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" -oN udp_53_dns_nmap.txt <hostname>
Perform zone transfer (only works over port 53/tcp) Vale considerar a entradea de DNS no arquivo resolv.conf:
echo "nameserver <ip_dns_server>" >> /etc/resolv.conf
dig axfr @<hostname> $domain 2>&1 | tee "tcp_53_dns_dig.txt"
host -t axfr <hostname> $dns_server
dnsenum htb.local
dnsrecon -d _msdcs.thinc.local -D /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -t brt
Perform reverse DNS lookup (may display NS record containing domain name)
nslookup <hostname> <hostname>
Brute force subdomains
gobuster dns -d $domain -w /usr/share/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt -t 16 -o "tcp_53_dns_gobuster.txt"
Enumerate domain
Primeiro temos que verificar se a gente consegue obter o nome do domínio por mieo de uma resolução invesrsa de DNS da seguinte maneira: Informar o serviço de DNS encontrado por meio do comando abaixo:
sudo nmap -sU -p 53 192.168.134.0/24 -oG dns_enum_lab.txt
#Assim que achado o DNS server (porta 53 aberta), fazemos um nslookup ou host para um host da rede
#host <IPS_DA_REDE> <IP_DNS_SERVER>
host 192.168.134.149 192.168.134.149
nslookup
server 192.168.134.149
host -t ns mailman.com # Para encontrar o name server do domínio
Enumerating subdomains
Brute-force:
dnsrecon -d target.com -D wordlist.txt -t brt
OBS: wordlist can be found at:
C:\Users\olive\Desktop\acosta\owncloud\Tools_Utilities\hacking-tools\fuzzdb\discovery\dns
DNS cache snooping:
dnsrecon -t snoop -D wordlist.txt -n 2.2.2.2 where 2.2.2.2 is the IP of the target’s NS server
Options --threads 8: Number of threads -n nsserver.com: Use a custom name server Output options --db: SQLite 3 file --xml: XML file --json: JSON file --csv: CSV file
DNS Zone transfer
dnsrecon -d target.com -t axfr
or
host -l target.com <dns_server_address>
OBS: First find which dns servers correspond to that domain with:
host -t ns target.com
DNS Query types:
https://ns1.com/resources/dns-types-records-servers-and-queries
Enumeração de DNS (domínio)
Preimeiro temos que identificar qual o servidor de DNS que responde por este serviço:
nmap -p 53 -sU --open 10.11.1.0/24 -oG dns_servers.txt
Assim que obtido o servidor, ou seja, obter a resposta do comando acima para os IPs que responderam com "open", configuramos ele no arquivo /etc/resolv.conf ccom a seguinte diretiva:
nameserver <IP_SERVER_DNS>
Feito isso, executamos o seguinte comando para obter o nome de domínio da rede alvo:
fping -d -a -g 10.0.0.0/24 # -> reverse DNS lookup
#ou
fping -d -A -a -g 10.0.0.0/24 #(para obter o endereço de IP ao lado do hostname)
Depois, tentamos realizar uma transferência de zona para obter informações a respeito do domínio:
host -t axfr thinc.local <IP_DNS_SERVER>
#ou
dig axfr thinc.local @<IP_DNS_SERVER> #Esse não funionou e não entendi o porquê
#ou
dnsenum thinc.local # pode ser informado a flag --dnsserver <IP_DNS_SERVER> para especificar o server de DNS
Dessa forma obtemos todas as informações a respeito daquele domínio. ALém disto, observamos um subdomínio especial ali e tentamos uma transferência de zona lá também, sem sucesso, mas anda temos mais uma possibilidade que é enumerar os subdomínios da seguinte forma:
dnsrecon -d _msdcs.thinc.local -D /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -t brt
HTTP/HTTPS
HTTP/HTTPS (80/tcp, 443/tcp)
Procurar por comentários nas páginas para verificar alguma informação sensível ou credencial
Criar wordlists com cewl se houver usuários ou possíveis senhas nas páginas:
Cewl
cewl $url/index.php -m 3 --with-numbers -w cewl.txt
Version detection + NSE scripts
nmap -Pn -sV -p $port "--script=banner,(http* or ssl*) and not (brute or broadcast or dos or external or http-slowloris* or fuzzer)" -oN tcp_port_protocol_nmap.txt <hostname>
sudo nmap -sS -p 80,443 --script "http* and not http-brute and not http-slowloris" -n 10.11.1.123
Nikto
nikto -h $url 2>&1 | tee "tcp_port_protocol_nikto.txt"
Directory brute force (Tentar várias listas de diretório possíveis dentro do diretório:)
/usr/share/seclists/Discovery/Web-Content/
gobuster dir -u $url -w /usr/share/seclists/Discovery/Web-Content/common.txt -x "txt,html,php,asp,aspx,jsp" -s "200,204,301,302,307,403,500" -k -t 16 -o "tcp_port_protocol_gobuster.txt"
gobuster dir -u http://10.10.10.63:50000 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x "txt,html,php,asp,aspx,jsp" -k -t 16 -o "tcp_port_protocol_jeeves_gobuster.txt"
gobuster dir -u http://10.10.10.63:50000 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x "txt,html,php,asp,aspx,jsp" -k -t 16 -o "tcp_port_protocol_jeeves_gobuster.txt" -c <cookie>
python3 /opt/dirsearch/dirsearch.py -u $url -t 16 -e txt,html,php,asp,aspx,jsp -f -x 403 -w /usr/share/seclists/Discovery/Web-Content/common.txt --plain-text-report="tcp_port_protocol_dirsearch.txt"
Dirbuster (GUI): only perform extension brute force - disable 'Brute Force Dirs'
wfuzz -c -z file,/usr/share/seclists/Discovery/Web-Content/common.txt --hc 404 -t 16 $url/FUZZ 2>&1 | tee "tcp_port_http_wfuzz.txt"
Directory brute force recursively with max depth = 2
python3 /opt/dirsearch/dirsearch.py -u $url/apps/ -t 16 -e txt,html,php -f -x 403 -r -R 2 -w /usr/share/seclists/Discovery/Web-Content/common.txt --plain-text-report="tcp_port_protocol_dirsearch_apps.txt"
Whatweb
whatweb --color=never --no-errors -a 3 -v $url 2>&1 | tee "tcp_port_protocol_whatweb.txt"
Wordpress
Enumerate vulnerable plugins and themes, timthumbs, wp-config.php backups, database exports, usernames and media IDs
wpscan --url http://<hostname> --no-update --disable-tls-checks -e vp,vt,tt,cb,dbe,u,m --plugins-detection aggressive --plugins-version-detection aggressive -f cli-no-color 2>&1 | tee tcp_port_protocol_wpscan.txt
Enumerate all plugins
wpscan --url $url --disable-tls-checks --no-update -e ap --plugins-detection aggressive -f cli-no-color 2>&1 | tee tcp_port_protocol_wpscan_plugins.txt
Subdomains
wfuzz -u https://streamio.htb -H "Host: FUZZ.streamio.htb" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --hh 315
Robots.txt
/robots.txt Only get HTTP headers
sitemap.xml
curl -I $url
Drupal
python3 drupwn --version 7.28 --mode enum --target $url
droopescan scan drupal -u $url
Shellshock
Check if bash vulnerable to CVE-2014-6271 (bash vulnerable if ‘vulnerable’ in output)
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Brute force CGI files
gobuster dir -u http://<hostname> -w /usr/share/seclists/Discovery/Web-Content/common.txt -x "txt,html,php,asp,aspx,jsp" -k -t 16 -o "tcp_port_protocol_gobuster.txt"
wfuzz -c -z file,/usr/share/seclists/Discovery/Web-Content/CGIs.txt --hc 404 -t 16 $url/cgi-bin/FUZZ 2>&1 | tee "tcp_port_protocol_wfuzz.txt"
Webmin uses cgi files - versions up to 1.700 vulnerable to shellshock (http://www.webmin.com/security.html)
Feito isso, temos de verificar algumas coisas:
Enumerar admin console e tentar brutar gerando uma wordlist com cewl ou tentar com rockyou.txt Navegar na aplicacao, obter a versao da aplicacao que esta sendo executada e buscar por exploits no google ou searchsploit. OBS: Vale considerar que nao e somente a versao do framework, linguagem de desenvolvimento ou a versao do web server, mas sim pelo proprio nome da aplicacao como no caso do phreebooks e apphp microblog, por exemplo
Outra experiência que vivi é que achei um exploit que descobria conteúdo de outros arquivos dentro do servidor. Não procurar somente por exploits de RCE, mas também que faça leituras de arquivos sensíveis na máquina alvo nos permite fazer a leitura de arquivos cujo conteúdo são as senhas dos usuários como /etc/passwd e /etc/shadow e depois crackear os hashes de senha offline.
Kerberos
Kerberos (88/tcp, 464/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p $port --script="banner,krb5-enum-users" -oN "tcp_port_kerberos_nmap.txt" <hostname>
kerbrute userenum -d domain --dc <hostname> users.txt
POP3/POP3S
POP3/POP3S (110/tcp, 995/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p $port "--script=banner,(pop3* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" -oN tcp_port_pop3_nmap.txt <hostname>
Interagindo com o serviço:
telnet <hostname> 110
USER admin
PASS P@ssw0rd
list
retr 1
retr 2
Podemos verificar via SSL também com o seguinte comando:
openssl s_client -starttls pop3 -connect <hostname>:110
RPC
RPC (111/tcp, 135/tcp) msrpc/rpcbind
Version detection + NSE scripts
nmap -Pn -sV -p $port --script=banner,msrpc-enum,rpc-grind,rpcinfo -oN tcp_port_rpc_nmap.txt <hostname>
impacket
impacket-rpcmap -brute-uuids -brute-opnums ncacn_ip_tcp:<hostname>
impacket-rpcdump <hostname>
rpcinfo
List all registered RPC programs
rpcinfo -p <hostname>
Provide compact results
rpcinfo -s <hostname>
Null session
Aqui um equívocona questão do rpcclient. Este client utiliza das portas 139 e 445 para comunicação.
rpcclient -U "" -N <hostname>
srvinfo
enumdomusers
getdompwinfo
querydominfo
netshareenum
netshareenumall
ident
ident (113/tcp)
Enumerate users services running as
ident-user-enum <hostname> 22 25 80 445
NTP
NTP (123/udp)
Run ntp-info NSE script
sudo nmap -sU -p 123 --script ntp-info <hostname>
NetBIOS-NS
NetBIOS-NS (137/udp)
enum4linux
enum4linux -a -M -l -d <hostname> 2>&1 | tee "enum4linux.txt"
nbtscan
nbtscan -rvh <hostname> 2>&1 | tee "nbtscan.txt"
SMB
SMB (139/tcp, 445/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p 445 "--script=banner,(nbstat or smb* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" --script-args=unsafe=1 -oN tcp_445_smb_nmap.txt <hostname>
smb-os-discovery, smb-enum-processes,smb-system-info.nse
smbmap
List share permissions
smbmap -H <hostname> -P 445 2>&1 | tee -a "smbmap-share-permissions.txt"; smbmap -u null -p "" -H <hostname> -P 445 2>&1 | tee -a "smbmap-share-permissions.txt"
List share contents
smbmap -H <hostname> -P 445 -R 2>&1 | tee -a "smbmap-list-contents.txt"; smbmap -u null -p "" -H <hostname> -P 445 -R 2>&1 | tee -a "smbmap-list-contents.txt"
enum4linux
enum4linux -a -M -l -d <hostname> 2>&1 | tee "enum4linux.txt"
Agressive mode
enum4linux -a -A <IP_VICTIM>
Enumerate Samba version (*nix)
NB: change interface tcpdump listening on
sudo ./smbver.sh <hostname> 139
Null session
smbmap -H <hostname>
smbclient -L //<hostname>
cme smb 10.11.1.xxx -u '' -p ''
cme smb 10.11.1.xxx -u 'guest' -p ''
smbclient -L //10.10.10.103
smbclient -L -U '' -N //10.10.10.103
Para conseguir fazer enunmeração mais rapidamente, é interessante que utilizemos o recurso de recursividade no smbclient com os seguintes comandos:
recurse on
dir
Enumerate shares
nmap --script smb-enum-shares -p 445 <hostname>
Connect to wwwroot share (try blank password)
smbclient \\\\<hostname>\\wwwroot
Nmap scans for SMB vulnerabilities (NB: can cause DoS)
RRAS Service Overflow https://docs.microsoft.com/en-us/security-updates/securitybulletins/2006/ms06-025
RCE vulnerabilities
nmap -Pn -sV -p 445 --script="smb-vuln-ms06-025" --script-args="unsafe=1" -oN "tcp_445_smb_ms06-025.txt" <hostname>
DNS RPC Service Overflow ,https://docs.microsoft.com/en-us/security-updates/securitybulletins/2007/ms07-029>
nmap -Pn -sV -p 445 --script="smb-vuln-ms07-029" --script-args="unsafe=1" -oN "tcp_445_smb_ms07-029.txt" <hostname>
Server Service Vulnerability https://docs.microsoft.com/en-us/security-updates/securitybulletins/2008/ms08-067
nmap -Pn -sV -p 445 --script="smb-vuln-ms08-067" --script-args="unsafe=1" -oN "tcp_445_smb_ms08-067.txt" <hostname>
Esse comando acima pode derrubar o servidor, então temos que ficar atentos com isso em redes produtivas.
Eternalblue https://docs.microsoft.com/en-us/security-updates/securitybulletins/2017/ms17-010
nmap -p 445 --script smb-vuln-ms17-010 -oN "tcp_445_smb_ms08-067.txt" <hostname>
Podemos considerar algumas ferramentas para fazer a checagem desse serviço. São elas:
IMAP/IMAPS
IMAP/IMAPS (143/tcp, 993/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p $port "--script=banner,(imap* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" -oN tcp_port_imap_nmap.txt <hostname>
SNMP
SNMP (161/udp)
Version detection + NSE scripts
sudo nmap -Pn -sU -sV -p 161 --script="banner,(snmp* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" -oN "udp_161_snmp-nmap.txt" <hostname>
snmp enumeration
sudo nmap -sU --open -p 161 10.11.1.1-254 -oG open-snmp.txt
There is a module on metasploit:
auxiliary/scanner/snmp/snmp_enum
set RHOSTS `ip`
default configuration
Module options (auxiliary/scanner/snmp/snmp_enum):
Name Current Setting Required Description
---- --------------- -------- -----------
COMMUNITY public yes SNMP Community String
RETRIES 1 yes SNMP Retries
RHOSTS 10.12.24.1 yes The target address range or CIDR identifier
RPORT 161 yes The target port (UDP)
THREADS 1 yes The number of concurrent threads
TIMEOUT 1 yes SNMP Timeout
VERSION 1 yes SNMP Version <1/2c>
Considerar
metasploit
no metasploit podemos utilizar o módulo
auxiliary/scanner/snmp/snmp_enum
, desta forma, podemos informar uma comunidade que já conhecemos ou tentar enumerar comunidades com o seguinte módulo:
auxiliary/scanner/snmp/snmp_login
SNMPWALK
snmpwalk -c public -v1 -t 10 10.11.1.14
Windows users
snmpwalk -c public -v1 10.11.1.14 1.3.6.1.4.1.77.1.2.25
Windows processes
snmpwalk -c public -v1 10.11.1.73 1.3.6.1.2.1.25.4.2.1.2
Windows TCP open ports
snmpwalk -c public -v1 10.11.1.14 1.3.6.1.2.1.6.13.1.3
Windows installed software:
snmpwalk -c public -v1 10.11.1.50 1.3.6.1.2.1.25.6.3.1.2
onesixtyone
echo public > community
echo private >> community
echo manager >> community
for ip in $(seq 1 254); do echo 10.11.1.$ip; done > ips
onesixtyone -c community -i ips
onesixtyone 192.168.4.0/24 public
onesixtyone -c dict.txt -i hosts -o my.log -w 100
SNMPCHECK
snmp-check -w -c public <hostname>
snmpbulkwalk
sudo apt update
sudo apt install snmp-mibs-downloader
snmpbulkwalk -c public -v2c <hostname> | tee snmpbulk.txt
python snmp_process_list.py snmpbulk.txt
snmp_process_list.py
#!/usr/bin/env python3
import re
import sys
from collections import defaultdict
from dataclasses import dataclass
@dataclass
class Process:
"""Process read from SNMP"""
pid: int
proc: str
args: str = ""
def __str__(self) -> str:
return f'{self.pid:04d} {self.proc} {self.args}'
with open(sys.argv[1]) as f:
data = f.read()
processes = {}
for match in re.findall(r'HOST-RESOURCES-MIB::hrSWRunName\.(\d+) = STRING: "(.+)"', data):
processes[match[0]] = Process(int(match[0]), match[1])
for match in re.findall(r'HOST-RESOURCES-MIB::hrSWRunParameters\.(\d+) = STRING: "(.+)"', data):
processes[match[0]].args = match[1]
for p in processes.values():
print(p)
LDAP
LDAP (389/tcp, 3268/tcp, 636/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p $port --script="banner,(ldap* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" -oN "tcp_port_ldap_nmap.txt" <hostname>
ldapsearch -H ldap:// 10.10.10.193 -x -s base namingcontexts
#Esse comando acima eh pra saber o nome do dominio
ldapsearch -H ldap://10.10.10.193 -x -b "DC=fabricorp,DC=local"
enum4linux
enum4linux -a -M -l -d <hostname> 2>&1 | tee "enum4linux.txt"
Para LDAPS
Importar o certificado:
echo -n | openssl s_client -connect 10.10.11.168:636 | sed -ne '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' > ldap.pem
sudo vi /etc/ldap/ldap.conf
TLS_CACERT /path/to/ldap.pem
ldapsearch -H ldaps://dc1.scrm.local -Z -D ksimpson@scrm.local -w ksimpson -b "DC=scrm,DC=local" "(objectClass=user)"
Java RMI
Java RMI (1100/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p 1100 --script="banner,rmi-vuln-classloader,rmi-dumpregistry" -oN "tcp_110_rmi_nmap.txt" <hostname>
MSSQL
MSSQL (1433/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p 1433 --script="banner,(ms-sql* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" --script-args="mssql.instance-port=1433,mssql.username=sa,mssql.password=sa" -oN "tcp_1433_mssql_nmap.txt" <hostname>
mssqlclient.py
MSSQL shell
mssqlclient.py -db msdb hostname/sa:password@<hostname>
List databases
SELECT name FROM master.dbo.sysdatabases
List tables
SELECT * FROM <database_name>.INFORMATION_SCHEMA.TABLES
List users and password hashes
SELECT sp.name AS login, sp.type_desc AS login_type, sl.password_hash, sp.create_date, sp.modify_date, CASE WHEN sp.is_disabled = 1 THEN 'Disabled' ELSE 'Enabled' END AS status FROM sys.server_principals sp LEFT JOIN sys.sql_logins sl ON sp.principal_id = sl.principal_id WHERE sp.type NOT IN ('G', 'R') ORDER BY sp.name
OracleTNSListener
Oracle TNS listener (1521/tcp)
sudo apt update
sudo apt install tnscmd10g
tnscmd10g version -h <hostname>
tnscmd10g status -h <hostname>
Uma outra opção para exploração do serviço Oracle é o seguinte... Primeiro, precisamos instalar o odat:
https://github.com/quentinhardy/odat
python odat.py -h
python odat.py sidguesser -s 10.129.125.94 -p 1521
Wordlist:
/usr/share/metasploit-framework/data/wordlists/oracle_default_userpass.txt
sed -i 's/ /\//g' /home/kali/ownCloud/owncloud/Area_de_trabalho/estudos/hack_the_box/silo/oracle_default_userpass.txt
python odat.py passwordguesser -s 10.129.125.94 -p 1521 --accounts-file /home/kali/ownCloud/owncloud/Area_de_trabalho/estudos/hack_the_box/silo/oracle_default_userpass.txt
NFS
NFS (2049/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p 111,2049 --script="banner,(rpcinfo or nfs*) and not (brute or broadcast or dos or external or fuzzer)" -oN "tcp_111_2049_nfs_nmap.txt" <hostname>
Show mount information
showmount -e <hostname>
Mount share
sudo mount -o rw,vers=2 <hostname>:/home /mnt
'-o nolock' used to disable file locking, needed for older NFS servers
sudo mount -o nolock <hostname>:/home /mnt/
sudo nmap -sS -p 111,2049 --script nfs-showmount,nfs-ls 10.11.1.72
nfs-ls (libnfs-utils)
#outra possibilidade também pode ser:
sudo apt update
sudo apt install libnfs-utils
#Com isso a gente consegue fazer a enumeração das permissividades dos arquivos em modo recursivo
nfs-ls -R nfs://10.11.1.72/home
showmount -e 10.11.1.72
nmap -sV -p 111 --script=rpcinfo 10.11.1.1-254
A premissa do NFS é o mesmo do SMB, compartilhar arquivos por meio da rede, acontece que no caso do NFS não é utilizado autenticação e autorização em suas versões 3 e 2, somente um grau de seguranã maior na sua versão 4.
Para explorar essa vulnerabilidade, primeiro precisamos fazer a enumeração do serviço por meio dos seguintes comandos:
sudo nmap -sS -p 111,2049 --script nfs-showmount,nfs-ls 10.11.1.72
#outra possibilidade também pode ser:
sudo apt update
sudo apt install libnfs-utils
#Com isso a gente consegue fazer a enumeração das permissividades dos arquivos em modo recursivo
nfs-ls -R nfs://10.11.1.72/home
showmount -e 10.11.1.72
nmap -sV -p 111 --script=rpcinfo 10.11.1.1-254
Exploitation
Assim que fizermos a enumeração, vamos identificar quais são os IDs pertinenetes aos arquivos lá constados no share via NFS, mas isso só é válido nas versões 2 e 3 do protocolo. A versão 4 já é mais segura! Basta adicionarmos o usuário e o grupo do usuário cujo uid e guid corespondem ao mesmo que foi identificao no momento da enumeração.
sudo adduser --uid 1014 pwn
sudo addgroup --gid 1014 pwn_group
sudo usermod -a -G pwn_group pwn
mount.nfs -o vers=3 10.11.1.72:/home /tmp/mount_dir
MySQL
MySQL (3306/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p 3306 --script="banner,(mysql* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" -oN "tcp_3306_mysql_nmap.txt" <hostname>
MySQL shell
mysql --host=<hostname> -u root -p
MySQL system variables
SHOW VARIABLES;
Show privileges granted to current user
SHOW GRANTS;
Show privileges granted to root user
Replace 'password' field with 'authentication_string' if it does not exist
SELECT user,password,create_priv,insert_priv,update_priv,alter_priv,delete_priv,drop_priv FROM mysql.user WHERE user = 'root';
Exact privileges
SELECT grantee, table_schema, privilege_type FROM information_schema.schema_privileges;
Enumerate file privileges (see here for discussion of file_priv)
SELECT user FROM mysql.user WHERE file_priv='Y';
RDP
RDP (3389/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p 3389 --script="banner,(rdp* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" -oN "tcp_3389_rdp_nmap.txt" <hostname>
sudo nmap -sS --script vulners,rdp* 10.11.1.123
SIP
Scans for SIP devices on network
svmap
svwar -m INVITE -e 200-250
PostgreSQL
PostgreSQL (5432/tcp)
Log into postgres remotely
PGPASSWORD=postgres psql -h <hostname> -p 5437 -U postgres
List databases
\list
SELECT datname FROM pg_database;
Use postgres database
\c postgres
List tables
\d
Describe table
\d table
Check if current user superuser (on = yes, off = no)
SELECT current_setting ('is_superuser');
Get user roles
\du+
Check user’s privileges over table (pg_shadow)
SELECT grantee, privilege_type FROM information_schema.role_table_grants WHERE table_name='pg_shadow';
Read file (/etc/passwd)
CREATE TABLE demo(t text);
COPY demo FROM '/etc/passwd';
SELECT * FROM demo;
Read usernames and password hashes
Postgresql password hash format: md5(secret || username) where || denotes string concatenation (remove md5 before cracking hash)
SELECT usename, passwd from pg_shadow;
Check if plpgsql enabled
Below result indicates that plpgsql enabled: lanname | lanacl
---------+---------
plpgsql |
SELECT lanname,lanacl FROM pg_language WHERE lanname = 'plpgsql'
PostgreSQL config file location
SHOW config_file;
VNC
VNC (5900/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p 5900 --script="banner,(vnc* or realvnc* or ssl*) and not (brute or broadcast or dos or external or fuzzer)" --script-args="unsafe=1" -oN "tcp_5900_vnc_nmap.txt" <hostname>
AJP
AJP (8009/tcp)
Version detection + NSE scripts
nmap -Pn -sV -p 8009 -n --script ajp-auth,ajp-headers,ajp-methods,ajp-request -oN tcp_8009_ajp_nmap.txt <hostname>