妖娆的代理工具shadowProxy – 神出鬼没的切换IP地址

栏目: Python · 发布时间: 8年前

内容简介:妖娆的代理工具shadowProxy – 神出鬼没的切换IP地址

前言

在渗透测试过程中,往往会遇到特别“小气”的目标,稍微碰一下就封IP。这种情况下,我们很自然的想到通过网上大量的免费代理进行IP隐匿。

那么问题来了,难道拿到哪些个代理,每用一次手动换下一个代理? 这太像火铳的工作方式了,想想就心累了。

so,小弟就来造一台机关枪,突突突突突… 想想就挺带感。

https://github.com/odboy/shadowProxy

功能实现

妖娆的代理工具shadowProxy – 神出鬼没的切换IP地址

代理功能

主要使用 python 内建的http.server和http.client库实现。

http.server相关的代码解读可参考我前一篇文章 Python源码分析之从SocketServer到SimpleHTTPServer

主要代理功能代码:

def do_GET(self):
 
     if self.path == 'http://shadow.proxy/':
         self.send_cacert()
         # print("%s download %s" % (self.client_address, self.cacert))
         return
 
     req = self
     content_length = int(req.headers.get('Content-Length', 0))
     req_body = self.rfile.read(content_length) if content_length else None
 
     if req.path[0] == '/':
         if isinstance(self.connection, ssl.SSLSocket): # ssl.SSLSocket or ssl.SSLContext
             req.path = "https://%s%s" % (req.headers['Host'], req.path)
         else:
             req.path = "http://%s%s" % (req.headers['Host'], req.path)
 
     u = urlparse(req.path)
     scheme, netloc= u.scheme, u.netloc
     assert scheme in ("http", "https")
     if netloc:
         req.headers['Host'] = netloc
     setattr(req, 'headers', self.filter_headers(req.headers))
 
     retryFlag = 0
     while retryFlag < 10 :
         try:
             target = (scheme, netloc)
             # 输入URL的协议和主机,返回可用的连接HTTP(S)Connection
             proxy = proxyCoor.dispatchProxy(target)
             if proxy is None:
                 print("未能获取到可用Proxy...(可能是Proxy耗尽...)")
                 self.send_error(502,"proxy resource RUN OUT!!!")
                 return
             print("%s --> [ %d ] %s" % (proxy, retryFlag + 1, req.path))
 
             if proxy.split("://")[0] == "http":
                 conn = http.client.HTTPConnection(proxy.split("://")[1], timeout=self.timeout)
             elif proxy.split("://")[0] == "https":
                 conn = http.client.HTTPSConnection(proxy.split("://")[1], timeout=self.timeout)
 
             conn.request(self.command, req.path, req_body, dict(req.headers))
             res = conn.getresponse()
             # res.response_version = 'HTTP/1.1' if res.version == 11 else 'HTTP/1.0'
             res_body = res.read()       # Transfer-Encoding并不需要特殊处理(除了Content-Length外)
 
         except Exception as e:
             retryFlag += 1
             # self.send_error(502)
             # return
         else:
             try:
                 if 'Content-Length' not in res.headers:
                     res.headers['Content-Length'] = str(len(res_body))
                 setattr(res, 'headers', self.filter_headers(res.headers))
                 self.send_response_only(res.status, res.reason)
                 for keyword in res.headers:
                     self.send_header(keyword, res.headers.get(keyword, ""))
                 self.end_headers()
                 self.wfile.write(res_body)
                 self.wfile.flush()
             except:
                 pass
             finally:
                 retryFlag = 9999  # 极大值,结束重试。
                 conn.close()
 
 
 # 其他方法重用GET的方法。
 do_HEAD = do_GET
 do_POST = do_GET
 do_PUT = do_GET
 do_DELETE = do_GET
 do_OPTIONS = do_GET
 do_TRACE = do_GET

代理协调者

主要实现:

导入代理列表

验证代理的可用性和匿名性

维护目标站点、代理列表二维表

根据维护的二维表,反馈可用的代理地址。

另外,我用的代理列表是从kuaidaili.com上爬取的,但代理的质量比较差,很头大。之前还用过xicidaili,情况也差不多。

验证公网IP的网站有如下几个:

http://ip.chinaz.com/getip.aspx

http://ifconfig.me/ip

http://api.ipify.org

https://ip.seeip.org

https://ifconfig.co/ip

https://myexternalip.com/raw

https://wtfismyip.com/text

https://icanhazip.com/

https://ipv4bot.whatismyipaddress.com/

https://ip4.seeip.org

测试验证

验证代码

透过shadowProxy访问http://ip.chinaz.com/getip.aspx,从而直观查看代理效果。

import requests
 import time
 
 i = 0
 while True:
     try:
         i += 1
         r =requests.get("http://ip.chinaz.com/getip.aspx",proxies={"http":"http://127.0.0.1:8088"},timeout=10)
         if r.status_code == 200:
             msg = "第 %d 次请求 :white_check_mark:\t%s"%(i,r.text)
         else:
             msg = "第 %d 次请求 :o:\t%d"% (i, r.status_code)
             time.sleep(2)
     except KeyboardInterrupt:
         print('\r***********************\n\t用户中断\t\n***********************')
         break
     except Exception as e:
         msg = "第 %d 次请求 :exclamation:\t%s" % (i, e )
         time.sleep(2)
     finally:
         print(msg)

效果展示

动图展示 : test_shadowProxy.gif

妖娆的代理工具shadowProxy – 神出鬼没的切换IP地址

枪是好枪,但还是存在一些问题的。

缺弹少药- 通过 工具 爬取到的代理很多重复,很多不可用,只有百八十个。

弹药质量差- 获取到的代理,很多无法传输大数据包(中断),小包也不稳定。

机枪卡壳- 由于上述问题,所以工具容错能力/重试功能有待提升。(后续考虑提升的点)

PS:后续代码完善后,可以考虑开源发布。

2018-01-10 Update

目前代理加入了自动重试功能,使其能更稳定的进行查询。

同时,找了个还算不错的proxylist。 https://github.com/fate0/proxylist

目前便可以比较顺畅的使用了:

妖娆的代理工具shadowProxy – 神出鬼没的切换IP地址

开源发布

https://github.com/odboy/shadowProxy

生成&安装证书

生成证书

shadowProxy git:(master) ✗ ll
     total 112
     -rw-r--r--  1 bingo  staff   573B Jan 10 16:42 PCtest.py
     -rw-r--r--  1 bingo  staff   5.9K Jan 10 16:42 ProxyCoordinator.py
     -rw-r--r--  1 bingo  staff    14B Jan 10 16:42 README.md
     drwxr-xr-x  3 bingo  staff    96B Jan 10 16:42 __pycache__
     -rw-r--r--  1 bingo  staff   100B Jan 10 16:42 proxylist-4.txt
     -rw-r--r--  1 bingo  staff    19K Jan 10 16:42 proxylist.txt
     -rwxr-xr-x  1 bingo  staff   302B Jan 10 16:42 setup_https_intercept.sh
     -rw-r--r--  1 bingo  staff    11K Jan 10 16:42 shadowProxy.py
 
     shadowProxy git:(master) ✗ ./setup_https_intercept.sh   # 直接运行脚本,生成根证书
     Generating RSA private key, 2048 bit long modulus
     ........................................................................................................................................+++
     ..................................................................+++
     e is 65537 (0x10001)
     Generating RSA private key, 2048 bit long modulus
     .....................................................................................................................................+++
     ...................+++
     e is 65537 (0x10001)

安装证书

在浏览器设置代理,指向 http://127.0.0.1:8088 , 然后访问 http://shadow.proxy/,即可弹出证书安装。(不同浏览器可能有所不同

妖娆的代理工具shadowProxy – 神出鬼没的切换IP地址

安装后,可以访问https网站。

使用测试

➜  shadowProxy git:(master) ✗ python shadowProxy.py -h
         .--.
        |o_o |    ------------------
        |:_/ |   < Author: Mr.Bingo >
       //   \ \   ------------------
      (|     | ) <    oddboy.cn     >
     /'\_   _/`\ ------------------     \___)=(___/ usage: shadowProxy.py [-h] [--bind BIND] [--port PORT]                       [--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]                       [--proxyListFile PROXYLISTFILE] optional arguments:   -h, --help            show this help message and exit   --bind BIND           Default: 0.0.0.0   --port PORT           Default: 8088   --log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}                         Default: WARNING   --proxyListFile PROXYLISTFILE                         代理列表文件                         ➜  shadowProxy git:(master) ✗ python shadowProxy.py         .--.        |o_o |    ------------------        |:_/ |   < Author: Mr.Bingo >       //   \ \  ------------------      (|     | ) <    oddboy.cn     >     /'\_   _/`\  ------------------
     \___)=(___/
 
 初始化代理池  本地IP :: 36.110.16.74
 导入代理池:::  proxylist.txt
 成功导入 110 个代理
 Serving HTTP on 0.0.0.0 port 8088 (http://0.0.0.0:8088/) ...

直接访问站点进行测试。

妖娆的代理工具shadowProxy – 神出鬼没的切换IP地址

由于该工具主要基于网上免费的代理进行IP隐匿的,所以稳定性仍然不够好,所以只建议用于特定的请求包测试。 在使用过程中遇到什么问题,欢迎给我邮件,我会进行修复完善,如果可以,给我的GitHub点颗星星,谢谢!

本站文章均属原创,转载请注明出处!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Design systems

Design systems

Not all design systems are equally effective. Some can generate coherent user experiences, others produce confusing patchwork designs. Some inspire teams to contribute to them, others are neglected. S......一起来看看 《Design systems》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具