{"id":5236,"date":"2023-01-20T16:14:03","date_gmt":"2023-01-20T19:14:03","guid":{"rendered":"https:\/\/base4sec.com\/nao-categorizado\/automatizar-a-implementacao-de-proxy-com-python\/"},"modified":"2023-01-20T16:14:03","modified_gmt":"2023-01-20T19:14:03","slug":"automatizar-a-implementacao-de-proxy-com-python","status":"publish","type":"post","link":"https:\/\/base4sec.com\/pt-br\/pesquisar\/automatizar-a-implementacao-de-proxy-com-python\/2023\/01\/20\/","title":{"rendered":"Automatizar a implementa\u00e7\u00e3o de proxy com Python"},"content":{"rendered":"<p>Durante a execu\u00e7\u00e3o de uma auditoria, ou noutros casos, tais como quando consumimos um servi\u00e7o, que pretendemos evitar o bloqueio de IP, ou no caso de correr uma web crawling\/spider, temos de encontrar uma forma de alterar o nosso verdadeiro IP a cada poucos pedidos ou tempo. Existem diferentes formas de executar esta tarefa dentro de duas categorias distintas, a forma de utilizar infra-estruturas gratuitas (tais como procuradores p\u00fablicos ou tor) e a outra utilizando um servi\u00e7o privado de um procurador rotativo ou a utiliza\u00e7\u00e3o do conhecido servi\u00e7o da Amazon.<\/p>\n<p>Neste caso, iremos analisar em pormenor como tirar partido das listas de procuradores p\u00fablicos, mas mencionaremos tamb\u00e9m os outros pontos acima mencionados.<\/p>\n<p>Iremos desenvolver um c\u00f3digo Python que facilitar\u00e1 a automatiza\u00e7\u00e3o de:<br \/>\n<b>\u2022<\/b>\u00a0Extrac\u00e7\u00e3o e digest\u00e3o de listas de procuradores p\u00fablicos<br \/>\n<b>\u2022<\/b>\u00a0Desenvolvimento de c\u00f3digo para filtrar proxies com base na lat\u00eancia e outros crit\u00e9rios.<br \/>\n<b>\u2022<\/b>\u00a0Verifica\u00e7\u00e3o autom\u00e1tica de cada procurador<br \/>\n<b>\u2022<\/b>\u00a0Configura\u00e7\u00e3o autom\u00e1tica de um equilibrador de carga com lista de proxy verificada<br \/>\n<b>\u2022<\/b>\u00a0Gera\u00e7\u00e3o de ficheiro de configura\u00e7\u00e3o de cadeias de procura\u00e7\u00e3o (alternativa)<\/p>\n<p><span class=\"subtitulo-nota\">Fonte e digest\u00e3o de informa\u00e7\u00e3o<\/span><\/p>\n<p>Antes de iniciarmos o desenvolvimento do primeiro projecto do c\u00f3digo, precisamos de encontrar uma fonte de informa\u00e7\u00e3o para o nosso prop\u00f3sito. Vale a pena notar que se tornarmos esta fase t\u00e3o simplificada quanto poss\u00edvel, poderemos mais tarde acrescentar mais facilmente novas fontes e prolongar a vida do c\u00f3digo e a paci\u00eancia do programador.<\/p>\n<p>Ap\u00f3s uma simples pesquisa no Google, encontramos um servi\u00e7o interessante devido \u00e0 forma aberta de partilhar a lista de procura\u00e7\u00f5es (download em formato json, txt, csv,&#8230;). Isto \u00e9 a nosso favor, pois estaremos a poupar tempo ao n\u00e3o termos de analisar o HTML.<\/p>\n<p>O servi\u00e7o que utilizaremos ser\u00e1 Genode (<a href=\"https:\/\/geonode.com\/free-proxy-list\/\">https:\/\/geonode.com\/free-proxy-list\/<\/a>)\u00a0<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5a.png\" alt=\"imagem ilustrativa\" \/><br \/>\nVamos analisar como obtemos esta informa\u00e7\u00e3o se a obtivermos com o curl e a processarmos com jq, mas primeiro vamos modificar um pouco o URL, uma vez que o link fornecido pela p\u00e1gina trar\u00e1 500 proxies, vamos trazer apenas um para examinar a resposta e a estrutura dos dados recebidos:<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5b.png\" alt=\"imagem ilustrativa\" \/><br \/>\nA resposta \u00e9 a seguinte:<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5c.png\" alt=\"imagem ilustrativa\" \/><br \/>\nPodemos utilizar toda esta informa\u00e7\u00e3o das formas mais criativas, para este caso s\u00f3 vamos utilizar dados[&#8220;ip&#8221;], dados[&#8220;lat\u00eancia&#8221;] e total. O n\u00famero total de procura\u00e7\u00f5es pode n\u00e3o ser muito importante agora, mas ser\u00e1 \u00fatil percorrer as diferentes p\u00e1ginas, tendo em mente que a url mostra os resultados por p\u00e1gina, e o n\u00famero m\u00e1ximo de procura\u00e7\u00f5es a trazer \u00e9 de 500. As seguintes fun\u00e7\u00f5es s\u00e3o simplificadas tanto quanto poss\u00edvel para compreender o fluxo de informa\u00e7\u00e3o, e foram removidos os fios desnecess\u00e1rios que tornam a leitura dif\u00edcil:<\/p>\n<p>Fun\u00e7\u00e3o get_proxys_count(\u201csocks5\u201d)<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5d.png\" alt=\"imagem ilustrativa\" \/><br \/>\nFun\u00e7\u00e3o parse_proxy_response(json,\u201dsocks5\u201d,50)<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5e.png\" alt=\"imagem ilustrativa\" \/><br \/>\nFun\u00e7\u00e3o get_proxy_list(\u201csocks5\u201d,50)<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5f.png\" alt=\"imagem ilustrativa\" \/><br \/>\nEstas tr\u00eas fun\u00e7\u00f5es obt\u00eam o json de cada p\u00e1gina dos proxies do tipo que queremos (http, https, meias4 e meias5), depois passa por esses dados e gera um array com os proxies que t\u00eam menos lat\u00eancia do que 50 (passamos isto como par\u00e2metro ao executar o script). Os dados ser\u00e3o armazenados da seguinte forma:<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5g.png\" alt=\"imagem ilustrativa\" \/><br \/>\n<span class=\"subtitulo-nota\">Teste de procura\u00e7\u00f5es<\/span><\/p>\n<p>Para esta fase, a pr\u00f3xima coisa a fazer \u00e9 tomar como entrada o resultado da fase anterior, onde j\u00e1 temos os nossos procuradores com o formato do ficheiro de configura\u00e7\u00e3o ProxyChains. Uma das formas de testar estes proxies \u00e9 fazer um pedido a uma p\u00e1gina web atrav\u00e9s do protocolo, ip e porta que obtivemos, e analisar a resposta. Com base nisto o nosso gui\u00e3o identificar\u00e1 quais os proxies que podemos utilizar a partir da nossa localiza\u00e7\u00e3o, se executarmos o gui\u00e3o a partir de diferentes pa\u00edses IP, obteremos resultados diferentes, uma vez que alguns proxies s\u00f3 s\u00e3o activados para certas \u00e1reas.<\/p>\n<p>Ao utilizar o m\u00f3dulo de pedido se testarmos por exemplo 2.000 procuradores, isto ser\u00e1 bastante lento se for feito um de cada vez. Para tal, vamos utilizar a biblioteca de enfiamento Python, com a biblioteca de enfiamento Python. Uma vez que a execu\u00e7\u00e3o do teste precisa de devolver um valor positivo ou negativo no caso de o procurador ser utiliz\u00e1vel, precisamos de declarar uma nova classe, a biblioteca em quest\u00e3o.<\/p>\n<p>Classe de rosca com valor de retorno<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5h.png\" alt=\"imagem ilustrativa\" \/><br \/>\nNow we can run the function that will check the proxies and determine based on the returned value if the proxy is alive or not. The function is as follows:<\/p>\n<p>Function check_proxy(\u201csocks5 1.1.1.1 3128\u201d,\u201dhttp:\/\/ifconfig.me\/ip\u201d)\u00a0<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5i.png\" alt=\"imagem ilustrativa\" \/><br \/>\nPodemos agora executar a fun\u00e7\u00e3o que ir\u00e1 verificar os procuradores e determinar com base no valor devolvido se o procurador est\u00e1 vivo ou n\u00e3o. A fun\u00e7\u00e3o \u00e9 a seguinte:<\/p>\n<p>Function do_multi_thread_check(array_proxies,\u201dhttp:\/\/ifconfig.me\/ip\u201d):<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5j.png\" alt=\"imagem ilustrativa\" \/><br \/>\nEsta fun\u00e7\u00e3o espec\u00edfica receber\u00e1 como par\u00e2metro a lista de procura\u00e7\u00f5es filtradas por lat\u00eancia e o website contra o qual queremos testar se funcionam.<\/p>\n<p>A l\u00f3gica de programa\u00e7\u00e3o desta \u00faltima fun\u00e7\u00e3o ser\u00e1 que, enquanto houver proxies no argumento dos proxies, ser\u00e3o criados 12 trabalhadores, cada um extraindo um proxy e removendo o valor extra\u00eddo da lista original at\u00e9 que o argumento esteja vazio. Se o procurador estiver vivo, o trabalhador que o verificou devolve a informa\u00e7\u00e3o, e esta \u00e9 armazenada numa nova vari\u00e1vel chamada good_ones. No final da tarefa, a fun\u00e7\u00e3o devolve estes procuradores de trabalho.<\/p>\n<p><span class=\"subtitulo-nota\">Equilibrador de carga<\/span><\/p>\n<p>A fase anterior deixou-nos com uma vari\u00e1vel com proxies testados e funcionais. A tarefa agora \u00e9 levantar um \u00fanico porto com um servi\u00e7o que possa distribuir a carga do tr\u00e1fego que pretendemos &#8220;proxy&#8221;. Uma boa alternativa para realizar esta tarefa, \u00e9 o seguinte projecto que se adapta \u00e0s nossas necessidades:\u00a0<a href=\"https:\/\/github.com\/extremecoders-re\/go-dispatch-proxy\">https:\/\/github.com\/extremecoders-re\/go-dispatch-proxy<\/a><\/p>\n<p>Esta ferramenta \u00e9 uma adapta\u00e7\u00e3o da expedi\u00e7\u00e3o-proxy desenvolvida em NodeJS e Golang. Este \u00faltimo detalhe parece interessante, uma vez que \u00e9 uma linguagem muito r\u00e1pida. Para utilizar a ferramenta, precisamos de instalar a libpcap-dev:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5k.png\" alt=\"imagem ilustrativa\" \/><br \/>\nPodemos compilar o projecto ou descarregar a vers\u00e3o funcional. No nosso caso, iremos compilar o c\u00f3digo na nossa m\u00e1quina<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5l.png\" alt=\"imagem ilustrativa\" \/><br \/>\nE \u00e9 tudo! Agora temos o bin\u00e1rio equilibrador de carga compilado, se tudo correu bem, devemos obter como sa\u00edda no \u00faltimo comando uma mensagem como a seguinte:\u00a0<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5m.png\" alt=\"imagem ilustrativa\" \/><br \/>\nO passo seguinte ser\u00e1 mover o bin\u00e1rio de equilibrador de carga para a pasta onde desenvolvemos o gui\u00e3o Python, depois disso, desenvolveremos a seguinte fun\u00e7\u00e3o para levantar o bin\u00e1rio compilado com os bons proxies que obtivemos no passo anterior:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5n.png\" alt=\"imagem ilustrativa\" \/><br \/>\nEsta fun\u00e7\u00e3o ir\u00e1 montar o comando de acordo com a documenta\u00e7\u00e3o do reposit\u00f3rio e execut\u00e1-lo atrav\u00e9s do subprocesso.run.<\/p>\n<p>Vamos executar o c\u00f3digo desenvolvido com os seguintes argumentos:<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5o.png\" alt=\"imagem ilustrativa\" \/><br \/>\nA execu\u00e7\u00e3o do nosso gui\u00e3o produz a seguinte produ\u00e7\u00e3o:<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5p.png\" alt=\"imagem ilustrativa\" \/><br \/>\nTemos agora um equilibrador de carga a funcionar com procuradores p\u00fablicos, mas tenha cuidado ao utilizar estes procuradores, pois geralmente registam todo o tr\u00e1fego enviado, incluindo cookies de sess\u00e3o, credenciais ou informa\u00e7\u00e3o sens\u00edvel que pode ser comprometida. Elevando a liga\u00e7\u00e3o atrav\u00e9s do protocolo Socks5 , o servi\u00e7o pode ser utilizado para digitalizar portas.<\/p>\n<p>Este balancim s\u00f3 funciona com meias5 proxies, pelo que o nosso c\u00f3digo deve ter a valida\u00e7\u00e3o correspondente para n\u00e3o levantar proxies de outros tipos (e assim desperdi\u00e7ar tempo valioso).<\/p>\n<p>Para realizar um scan de porta, necessitar\u00e1 de um scanner que tenha suporte para meias5 proxy, tal como naabu (<a href=\"https:\/\/github.com\/projectdiscovery\/naabu\" rel=\"nofollow\">https:\/\/github.com\/projectdiscovery\/naabu<\/a>). Basta passar o scanner pela porta do equilibrador de carga, que est\u00e1 definida para 8080 por defeito.<\/p>\n<p><span class=\"subtitulo-nota\">Gera\u00e7\u00e3o de proxychains.conf<\/span><\/p>\n<p>Analisando at\u00e9 agora, analis\u00e1mos as listas de procura\u00e7\u00e3o, process\u00e1mo-las, test\u00e1mos o estado de cada uma e constru\u00edmos um equilibrador de carga com as activas, tudo de forma automatizada. Poder\u00edamos acrescentar mais uma funcionalidade ao nosso script, na qual geramos um ficheiro de configura\u00e7\u00e3o de cadeias de procura\u00e7\u00e3o. A seguinte fun\u00e7\u00e3o far\u00e1 o trabalho:<\/p>\n<p>Fun\u00e7\u00e3o print_proxy_chains_file(array_of_active_proxies,1):<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5q.png\" alt=\"imagem ilustrativa\" \/><br \/>\nVamos executar o nosso script para que, em vez de levantar um equilibrador de carga, imprima o ficheiro de configura\u00e7\u00e3o das cadeias proxy, desta vez vamos baixar a lat\u00eancia para n\u00e3o testarmos tantos proxies e usar a sa\u00edda como um exemplo r\u00e1pido. Tamb\u00e9m testaremos a partir de um vps as liga\u00e7\u00f5es de entrada dos procuradores para verificar de onde as obtemos:<\/p>\n<p>No localhost:<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5r.png\" alt=\"imagem ilustrativa\" \/><br \/>\nNo the VPS:<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5s.png\" alt=\"imagem ilustrativa\" \/><br \/>\nA produ\u00e7\u00e3o sobre o localhost, d\u00e1 o seguinte resultado:<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5t.png\" alt=\"imagem ilustrativa\" \/><br \/>\nEnquanto no lado do VPS obtemos o seguinte resultado:<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5u.png\" alt=\"imagem ilustrativa\" \/><br \/>\nPara utilizar os proxies que obtivemos, s\u00f3 precisamos de copiar a sa\u00edda do gui\u00e3o para o ficheiro proxychains.conf:<br \/>\n<img decoding=\"async\" src=\"https:\/\/wwww.base4sec.com\/assets\/images\/blog\/nota-5v.png\" alt=\"imagem ilustrativa\" \/><br \/>\n<span class=\"subtitulo-nota\">Conclus\u00e3o<\/span><\/p>\n<p>Desta forma, podemos automatizar a tarefa de verificar uma lista de procuradores e utiliz\u00e1-los com cadeias de procuradores ou levantando o nosso pr\u00f3prio equilibrador de carga. Como descrito na introdu\u00e7\u00e3o, existem outras formas de executar esta tarefa, por exemplo, utilizando o projecto de doca rotativa-tor-http-proxy podemos elevar um HAProxy sobre o protocolo HTTP que tem a mesma funcionalidade que o c\u00f3digo que desenvolvemos mas utilizando m\u00faltiplas inst\u00e2ncias de tor, que s\u00e3o actualizadas de tempos a tempos.<\/p>\n<p>Al\u00e9m disso, existe outra alternativa que utiliza os servi\u00e7os API Gateway da Amazon, este m\u00e9todo \u00e9 muito r\u00e1pido quando queremos realizar fuzzing na web e escapar aos controlos de bloqueio de IP. Estes \u00faltimos m\u00e9todos mencionados n\u00e3o s\u00e3o compat\u00edveis com um scan de porta, uma vez que o protocolo utilizado \u00e9 HTTP e para este cen\u00e1rio a \u00fanica forma poss\u00edvel \u00e9 o gui\u00e3o desenvolvido neste texto.<\/p>\n<p>O reposit\u00f3rio GitHub, onde se encontra todo o c\u00f3digo desenvolvido da ferramenta, est\u00e1 abaixo:\u00a0<a href=\"https:\/\/github.com\/BASE4-offensive-operations\/autolb-proxies\">https:\/\/github.com\/BASE4-offensive-operations\/autolb-proxies<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Durante a execu\u00e7\u00e3o de uma auditoria, ou noutros casos, tais como quando consumimos um servi\u00e7o, que pretendemos evitar o bloqueio de IP, ou no caso de correr uma web crawling\/spider, temos de encontrar uma forma de alterar o nosso verdadeiro IP a cada poucos pedidos ou tempo. Existem diferentes formas de executar esta tarefa dentro [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":5023,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"footnotes":""},"categories":[96],"tags":[],"class_list":{"0":"post-5236","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-pesquisar"},"jetpack_featured_media_url":"https:\/\/base4sec.com\/wp-content\/uploads\/2023\/01\/blog_24.png","_links":{"self":[{"href":"https:\/\/base4sec.com\/pt-br\/wp-json\/wp\/v2\/posts\/5236","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/base4sec.com\/pt-br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/base4sec.com\/pt-br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/base4sec.com\/pt-br\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/base4sec.com\/pt-br\/wp-json\/wp\/v2\/comments?post=5236"}],"version-history":[{"count":0,"href":"https:\/\/base4sec.com\/pt-br\/wp-json\/wp\/v2\/posts\/5236\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/base4sec.com\/pt-br\/wp-json\/wp\/v2\/media\/5023"}],"wp:attachment":[{"href":"https:\/\/base4sec.com\/pt-br\/wp-json\/wp\/v2\/media?parent=5236"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/base4sec.com\/pt-br\/wp-json\/wp\/v2\/categories?post=5236"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/base4sec.com\/pt-br\/wp-json\/wp\/v2\/tags?post=5236"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}