├── images
├── image1.png
├── image2.png
├── image3.png
├── image4.png
└── image5.png
├── README.md
└── rpcenum
/images/image1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/s4vitar/rpcenum/HEAD/images/image1.png
--------------------------------------------------------------------------------
/images/image2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/s4vitar/rpcenum/HEAD/images/image2.png
--------------------------------------------------------------------------------
/images/image3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/s4vitar/rpcenum/HEAD/images/image3.png
--------------------------------------------------------------------------------
/images/image4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/s4vitar/rpcenum/HEAD/images/image4.png
--------------------------------------------------------------------------------
/images/image5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/s4vitar/rpcenum/HEAD/images/image5.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # RPCenum
2 |
3 | Herramienta en Bash ideal para efectuar una enumeración básica y extraer la información más relevante de un dominio vía rpcclient.
4 |
5 | Esta utilidad nos permitirá obtener la siguiente información de un dominio:
6 |
7 | * Usuarios del dominio
8 | * Usuarios del dominio con información
9 | * Usuarios administradores del dominio
10 | * Grupos del dominio
11 |
12 | ¿Cómo funciona?
13 | ======
14 | La ejecución de la herramienta mostrará el siguiente panel de ayuda:
15 |
16 |
17 |
20 |
21 |
22 | Para su correcta ejecución, es necesario especificar el modo de enumeración a usar, siendo los representados en la imagen adjunta.
23 |
24 | El modo de enumeración **DUsers**, nos permitirá obtener un listado de los usuarios existentes en el dominio (siempre y cuando el **Null Session** esté habilitado):
25 |
26 |
27 |
30 |
31 |
32 | El modo de enumeración **DUsersInfo**, nos permitirá obtener un listado de los usuarios existentes en el dominio con descripción (siempre y cuando el **Null Session** esté habilitado), pudiendo así identificar a usuarios potenciales:
33 |
34 |
35 |
38 |
39 |
40 | El modo de enumeración **DAUsers**, nos permitirá obtener un listado de los usuarios existentes administradores del dominio (siempre y cuando el **Null Session** esté habilitado). Esta parte es crucial, puesto que el atacante siempre va a ir en busca de las credenciales de estos, dado que poseen privilegio total sobre el dominio.
41 |
42 |
43 |
46 |
47 |
48 | El modo de enumeración **DGroups**, nos permitirá obtener un listado de los grupos existentes del dominio (siempre y cuando el **Null Session** esté habilitado).
49 |
50 |
51 |
54 |
55 |
56 | Por último, el modo de enumeración **All**, nos efectuará todas las enumeraciones de forma simultánea, pudiendo así visualizar la información más relevante del dominio.
57 |
58 | **ANOTACIÓN**: Es posible que se añadan nuevas opciones a la herramienta.
59 |
--------------------------------------------------------------------------------
/rpcenum:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Author: Marcelo Vázquez (aka S4vitar)
4 |
5 | #Colours
6 | greenColour="\e[0;32m\033[1m"
7 | endColour="\033[0m\e[0m"
8 | redColour="\e[0;31m\033[1m"
9 | blueColour="\e[0;34m\033[1m"
10 | yellowColour="\e[0;33m\033[1m"
11 | purpleColour="\e[0;35m\033[1m"
12 | turquoiseColour="\e[0;36m\033[1m"
13 | grayColour="\e[0;37m\033[1m"
14 |
15 | declare -r tmp_file="/dev/shm/tmp_file"
16 | declare -r tmp_file2="/dev/shm/tmp_file2"
17 | declare -r tmp_file3="/dev/shm/tmp_file3"
18 |
19 | function ctrl_c(){
20 |
21 | echo -e "\n${yellowColour}[*]${endColour}${grayColour} Exiting...${endColour}"; sleep 1
22 | rm $tmp_file 2>/dev/null
23 | tput cnorm; exit 1
24 | }
25 |
26 | function helpPanel(){
27 |
28 | echo -e "\n${yellowColour}[*]${endColour}${grayColour} Uso: rpcenum${endColour}"
29 | echo -e "\n\t${purpleColour}e)${endColour}${yellowColour} Enumeration Mode${endColour}"
30 | echo -e "\n\t\t${grayColour}DUsers${endColour}${redColour} (Domain Users)${endColour}"
31 | echo -e "\t\t${grayColour}DUsersInfo${endColour}${redColour} (Domain Users with info)${endColour}"
32 | echo -e "\t\t${grayColour}DAUsers ${redColour}(Domain Admin Users)${endColour}"
33 | echo -e "\t\t${grayColour}DGroups ${redColour}(Domain Groups)${endColour}"
34 | echo -e "\t\t${grayColour}All ${redColour}(All Modes)${endColour}"
35 | echo -e "\n\t${purpleColour}i)${endColour}${yellowColour} Host IP Address${endColour}"
36 | echo -e "\n\t${purpleColour}h)${endColour}${yellowColour} Show this help pannel${endColour}"
37 | exit 1
38 | }
39 |
40 | function printTable(){
41 |
42 | local -r delimiter="${1}"
43 | local -r data="$(removeEmptyLines "${2}")"
44 |
45 | if [[ "${delimiter}" != '' && "$(isEmptyString "${data}")" = 'false' ]]
46 | then
47 | local -r numberOfLines="$(wc -l <<< "${data}")"
48 |
49 | if [[ "${numberOfLines}" -gt '0' ]]
50 | then
51 | local table=''
52 | local i=1
53 |
54 | for ((i = 1; i <= "${numberOfLines}"; i = i + 1))
55 | do
56 | local line=''
57 | line="$(sed "${i}q;d" <<< "${data}")"
58 |
59 | local numberOfColumns='0'
60 | numberOfColumns="$(awk -F "${delimiter}" '{print NF}' <<< "${line}")"
61 |
62 | if [[ "${i}" -eq '1' ]]
63 | then
64 | table="${table}$(printf '%s#+' "$(repeatString '#+' "${numberOfColumns}")")"
65 | fi
66 |
67 | table="${table}\n"
68 |
69 | local j=1
70 |
71 | for ((j = 1; j <= "${numberOfColumns}"; j = j + 1))
72 | do
73 | table="${table}$(printf '#| %s' "$(cut -d "${delimiter}" -f "${j}" <<< "${line}")")"
74 | done
75 |
76 | table="${table}#|\n"
77 |
78 | if [[ "${i}" -eq '1' ]] || [[ "${numberOfLines}" -gt '1' && "${i}" -eq "${numberOfLines}" ]]
79 | then
80 | table="${table}$(printf '%s#+' "$(repeatString '#+' "${numberOfColumns}")")"
81 | fi
82 | done
83 |
84 | if [[ "$(isEmptyString "${table}")" = 'false' ]]
85 | then
86 | echo -e "${table}" | column -s '#' -t | awk '/^\+/{gsub(" ", "-", $0)}1'
87 | fi
88 | fi
89 | fi
90 | }
91 |
92 | function removeEmptyLines(){
93 |
94 | local -r content="${1}"
95 | echo -e "${content}" | sed '/^\s*$/d'
96 | }
97 |
98 | function repeatString(){
99 |
100 | local -r string="${1}"
101 | local -r numberToRepeat="${2}"
102 |
103 | if [[ "${string}" != '' && "${numberToRepeat}" =~ ^[1-9][0-9]*$ ]]
104 | then
105 | local -r result="$(printf "%${numberToRepeat}s")"
106 | echo -e "${result// /${string}}"
107 | fi
108 | }
109 |
110 | function isEmptyString(){
111 |
112 | local -r string="${1}"
113 |
114 | if [[ "$(trimString "${string}")" = '' ]]
115 | then
116 | echo 'true' && return 0
117 | fi
118 |
119 | echo 'false' && return 1
120 | }
121 |
122 | function trimString(){
123 |
124 | local -r string="${1}"
125 | sed 's,^[[:blank:]]*,,' <<< "${string}" | sed 's,[[:blank:]]*$,,'
126 | }
127 |
128 | function extract_DUsers(){
129 |
130 | echo -e "\n${yellowColour}[*]${endColour}${grayColour} Enumerating Domain Users...${endColour}\n"
131 | domain_users=$(rpcclient -U "" $1 -c "enumdomusers" -N | grep -oP '\[.*?\]' | grep -v 0x | tr -d '[]')
132 |
133 | echo "Users" > $tmp_file && for user in $domain_users; do echo "$user" >> $tmp_file; done
134 |
135 | echo -ne "${blueColour}"; printTable ' ' "$(cat $tmp_file)"; echo -ne "${endColour}"
136 | rm $tmp_file 2>/dev/null
137 | }
138 |
139 | function extract_DUsers_Info(){
140 |
141 | extract_DUsers $1 > /dev/null 2>&1
142 |
143 | echo -e "\n${yellowColour}[*]${endColour}${grayColour} Listing domain users with description...${endColour}\n"
144 |
145 | for user in $domain_users; do
146 | rpcclient -U "" $1 -c "queryuser $user" -N | grep -E 'User Name|Description' | cut -d ':' -f 2-100 | sed 's/\t//' | tr '\n' ',' | sed 's/.$//' >> $tmp_file
147 | echo -e '\n' >> $tmp_file
148 | done
149 |
150 | echo "User,Description" > $tmp_file2
151 |
152 | cat $tmp_file | sed '/^\s*$/d' | while read user_representation; do
153 | if [ "$(echo $user_representation | awk '{print $2}' FS=',')" ]; then
154 | echo "$(echo $user_representation | awk '{print $1}' FS=','),$(echo $user_representation | awk '{print $2}' FS=',')" >> $tmp_file2
155 | fi
156 | done
157 |
158 | rm $tmp_file; mv $tmp_file2 $tmp_file
159 | sleep 1; echo -ne "${blueColour}"; printTable ',' "$(cat $tmp_file)"; echo -ne "${endColour}"
160 | rm $tmp_file 2>/dev/null
161 | }
162 |
163 | function extract_DAUsers(){
164 |
165 | echo -e "\n${yellowColour}[*]${endColour}${grayColour} Enumerating Domain Admin Users...${endColour}\n"
166 | rid_dagroup=$(rpcclient -U "" $1 -c "enumdomgroups" -N | grep "Domain Admins" | awk 'NF{print $NF}' | grep -oP '\[.*?\]' | tr -d '[]')
167 | rid_dausers=$(rpcclient -U "" $1 -c "querygroupmem $rid_dagroup" -N | awk '{print $1}' | grep -oP '\[.*?\]' | tr -d '[]')
168 |
169 | echo "DomainAdminUsers" > $tmp_file; for da_user_rid in $rid_dausers; do
170 | rpcclient -U "" $1 -c "queryuser $da_user_rid" -N | grep 'User Name'| awk 'NF{print $NF}' >> $tmp_file
171 | done
172 |
173 | echo -ne "${blueColour}"; printTable ' ' "$(cat $tmp_file)"; echo -ne "${endColour}"
174 | rm $tmp_file 2>/dev/null
175 | }
176 |
177 | function extract_DGroups(){
178 |
179 | echo -e "\n${yellowColour}[*]${endColour}${grayColour} Enumerating Domain Groups...${endColour}\n"
180 |
181 | rpcclient -U "" $host_ip -c "enumdomgroups" -N | grep -oP '\[.*?\]' | grep "0x" | tr -d '[]' >> $tmp_file
182 |
183 | echo "DomainGroup,Description" > $tmp_file2
184 | cat $tmp_file | while read rid_domain_groups; do
185 | rpcclient -U "" $host_ip -c "querygroup $rid_domain_groups" -N | grep -E 'Group Name|Description' | sed 's/\t//' > $tmp_file3
186 | group_name=$(cat $tmp_file3 | grep "Group Name" | awk '{print $2}' FS=":")
187 | group_description=$(cat $tmp_file3 | grep "Description" | awk '{print $2}' FS=":")
188 |
189 | echo "$(echo $group_name),$(echo $group_description)" >> $tmp_file2
190 | done
191 |
192 | rm $tmp_file $tmp_file3 2>/dev/null && mv $tmp_file2 $tmp_file
193 | echo -ne "${blueColour}"; printTable ',' "$(cat $tmp_file)"; echo -ne "${endColour}"
194 | rm $tmp_file 2>/dev/null
195 | }
196 |
197 | function extract_All(){
198 | extract_DUsers $1
199 | extract_DUsers_Info $1
200 | extract_DAUsers $1
201 | extract_DGroups $1
202 | }
203 |
204 | function beginEnumeration(){
205 |
206 | tput civis; nmap -p139 --open -T5 -v -n $host_ip | grep open > /dev/null 2>&1 && port_status=$?
207 | rpcclient -U "" $host_ip -c "enumdomusers" -N > /dev/null 2>&1
208 |
209 | if [ "$(echo $?)" == "0" ]; then
210 | if [ "$port_status" == "0" ]; then
211 | case $enum_mode in
212 | DUsers)
213 | extract_DUsers $host_ip
214 | ;;
215 | DUsersInfo)
216 | extract_DUsers_Info $host_ip
217 | ;;
218 | DAUsers)
219 | extract_DAUsers $host_ip
220 | ;;
221 | DGroups)
222 | extract_DGroups $host_ip
223 | ;;
224 | All)
225 | extract_All $host_ip
226 | ;;
227 | *)
228 | echo -e "\n${redColour}[!] Opción no válida${endColour}"
229 | helpPanel
230 | exit 1
231 | ;;
232 | esac
233 | else
234 | echo -e "\n${redColour}Port 139 seems to be closed on $host_ip${endColour}"
235 | tput cnorm; exit 0
236 | fi
237 | else
238 | echo -e "\n${redColour}[!] Error: Access Denied${endColour}"
239 | tput cnorm; exit 0
240 | fi
241 | }
242 |
243 | # Main Function
244 |
245 | if [ "$(echo $UID)" == "0" ]; then
246 | declare -i parameter_counter=0; while getopts ":e:i:h:" arg; do
247 | case $arg in
248 | e) enum_mode=$OPTARG; let parameter_counter+=1;;
249 | i) host_ip=$OPTARG; let parameter_counter+=1;;
250 | h) helpPanel;;
251 | esac
252 | done
253 |
254 | if [ $parameter_counter -ne 2 ]; then
255 | helpPanel
256 | else
257 | beginEnumeration
258 | tput cnorm
259 | fi
260 | else
261 | echo -e "\n${redColour}[*] It is necessary to run the program as root${endColour}\n"
262 | fi
263 |
--------------------------------------------------------------------------------