From d8dfee5864a562dff7d90cc0ab033be08ee38690 Mon Sep 17 00:00:00 2001 From: Spencer McIntyre Date: Wed, 26 Oct 2022 17:07:29 -0400 Subject: [PATCH] Move the python code into python files --- data/meterpreter/python/met_aes.py | 130 +++++++++++ data/meterpreter/python/met_rsa.py | 57 +++++ .../core/payload/python/meterpreter_loader.rb | 203 +----------------- 3 files changed, 194 insertions(+), 196 deletions(-) create mode 100644 data/meterpreter/python/met_aes.py create mode 100644 data/meterpreter/python/met_rsa.py diff --git a/data/meterpreter/python/met_aes.py b/data/meterpreter/python/met_aes.py new file mode 100644 index 0000000000..7ccc4c6696 --- /dev/null +++ b/data/meterpreter/python/met_aes.py @@ -0,0 +1,130 @@ +import copy,struct,sys +def chunks(lst, n): + for i in range(0,len(lst),n): + yield lst[i:i+n] +def _cw(word): + return(word[0]<<24)|(word[1]<<16)|(word[2]<<8)|word[3] +def _s2b(text): + return list(ord(c)for c in text) +def _b2s(binary): + return "".join(chr(b)for b in binary) +if sys.version_info[0]>=3: + xrange=range + def _s2b(text): + if isinstance(text,bytes): + return text + return[ord(c)for c in text] + def _b2s(binary): + return bytes(binary) +else: + bytes=lambda s,e:s +def _gmul(a, b): + r=0 + while b: + if b&1: r^=a + a<<=1 + if a>255: a^=0x11B + b>>=1 + return r +def _mix(n, vec): + return sum(_gmul(n,v)<<(24-8*shift) for shift,v in enumerate(vec)) +def _ror32(n): + return (n&255)<<24|n>>8 +def _rcon(): + return [_gmul(1, 1<i',key[i:i+4])[0]for i in xrange(0,len(key),4)];rconpointer=0;t=KC + for i in xrange(0,KC): + self._Ke[i//4][i%4]=tk[i];self._Kd[rds-(i//4)][i%4]=tk[i] + while t < rnd_kc: + tt=tk[KC-1];tk[0]^=((self.S[(tt>>16)&255]<<24)^(self.S[(tt>>8)&255]<<16)^(self.S[tt&255]<<8)^self.S[(tt>>24)&255]^(self.rcon[rconpointer]<<24));rconpointer+=1 + if KC!=8: + for i in xrange(1,KC): + tk[i]^=tk[i-1] + else: + for i in xrange(1,KC//2): + tk[i]^=tk[i-1] + tt=tk[KC//2-1];tk[KC//2]^=(self.S[tt&255]^(self.S[(tt>>8)&255]<<8)^(self.S[(tt>>16)&255]<<16)^(self.S[(tt>>24)&255]<<24)) + for i in xrange(KC//2+1,KC): + tk[i]^=tk[i-1] + j=0 + while j>24)&255]^self.U2[(tt>>16)&255]^self.U3[(tt>>8)&255]^self.U4[tt&255]) + def _encdec(self,data,K,s,S,L1,L2,L3,L4): + if len(data)!=16: + raise ValueError('wrong block length') + rds=len(K)-1;(s1,s2,s3)=s;a=[0,0,0,0];t=[(_cw(data[4*i:4*i+4])^K[0][i])for i in xrange(0,4)] + for r in xrange(1,rds): + for i in xrange(0,4): + a[i]=(L1[(t[i]>>24)&255]^L2[(t[(i+s1)%4]>>16)&255]^L3[(t[(i+s2)%4]>>8)&255]^L4[t[(i+s3)%4]&255]^K[r][i]) + t=copy.copy(a) + rst=[] + for i in xrange(0,4): + tt=K[rds][i];rst.append((S[(t[i]>>24)&255]^(tt>>24))&255);rst.append((S[(t[(i+s1)%4]>>16)&255]^(tt>>16))&255);rst.append((S[(t[(i+s2)%4]>>8)&255]^(tt>>8))&255);rst.append((S[t[(i+s3)%4]&255]^tt)&255) + return rst + def enc_in(self,pt): + return self._encdec(pt,self._Ke,[1,2,3],self.S,self.T1,self.T2,self.T3,self.T4) + def dec_in(self,ct): + return self._encdec(ct,self._Kd,[3,2,1],self.Si,self.T5,self.T6,self.T7,self.T8) + def pad(self,pt): + c=16-(len(pt)%16) + return pt+bytes(chr(c)*c,'utf-8') + def unpad(self,pt): + c=pt[-1] + if type(c)!=int: + c=ord(c) + return pt[:-c] + def encrypt(self,iv,pt): + if len(iv)!=16: + raise ValueError('initialization vector must be 16 bytes') + else: + self._lcb=_s2b(iv) + pt=self.pad(pt) + return empty.join([self.enc_b(b)for b in chunks(pt,16)]) + def enc_b(self,pt): + if len(pt)!=16: + raise ValueError('plaintext block must be 16 bytes') + pt=_s2b(pt);pcb=[(p^l)for(p,l)in zip(pt,self._lcb)];self._lcb=self.enc_in(pcb) + return _b2s(self._lcb) + def decrypt(self,iv,ct): + if len(iv)!=16: + raise ValueError('initialization vector must be 16 bytes') + else: + self._lcb=_s2b(iv) + if len(ct)%16!=0: + raise ValueError('ciphertext must be a multiple of 16') + return self.unpad(empty.join([self.dec_b(b)for b in chunks(ct,16)])) + def dec_b(self,ct): + if len(ct)!=16: + raise ValueError('ciphertext block must be 16 bytes') + cb=_s2b(ct);pt=[(p^l)for(p,l)in zip(self.dec_in(cb),self._lcb)];self._lcb=cb + return _b2s(pt) diff --git a/data/meterpreter/python/met_rsa.py b/data/meterpreter/python/met_rsa.py new file mode 100644 index 0000000000..e2c26b048d --- /dev/null +++ b/data/meterpreter/python/met_rsa.py @@ -0,0 +1,57 @@ +import sys,math,random,binascii as ba,os +from struct import unpack as u +from struct import pack +is2 = sys.version_info[0]<3 +def bt(b): + if is2: + return b + return ord(b) +def b2i(b): + return int(ba.b2a_hex(b),16) +def i2b(i): + h='%x'%i + if len(h)%2==1: + h ='0'+h + if not is2: + h=h.encode('utf-8') + return ba.a2b_hex(h) +def rs(a,o): + if a[o]==bt(pack('B',0x81)): + return(u('B',a[o+1])[0],2+o) + elif a[o] == bt(pack('B',0x82)): + return(u('>H',a[o+1:o+3])[0],3+o) +def ri(b,o): + i,o =rs(b,o) + return(b[o:o+i],o+i) +def b2me(b): + if b[0]!=bt(pack('B',0x30)): + return(None,None) + _,o=rs(b,1) + if b[o]!=bt(pack('B',2)): + return(None,None) + (m,o)=ri(b,o+1) + if b[o]!=bt(pack('B',2)): + return(None,None) + e=b[o+2:] + return(b2i(m),b2i(e)) +def der2me(d): + if d[0]!=bt(pack('B',0x30)): + return(None,None) + _,o=rs(d,1) + while oH',a[o+1:o+3])[0],3+o) -def ri(b,o): - i,o =rs(b,o) - return(b[o:o+i],o+i) -def b2me(b): - if b[0]!=bt(pack('B',0x30)): - return(None,None) - _,o=rs(b,1) - if b[o]!=bt(pack('B',2)): - return(None,None) - (m,o)=ri(b,o+1) - if b[o]!=bt(pack('B',2)): - return(None,None) - e=b[o+2:] - return(b2i(m),b2i(e)) -def der2me(d): - if d[0]!=bt(pack('B',0x30)): - return(None,None) - _,o=rs(d,1) - while o=3: - xrange=range - def _s2b(text): - if isinstance(text,bytes): - return text - return[ord(c)for c in text] - def _b2s(binary): - return bytes(binary) -else: - bytes=lambda s,e:s -def _gmul(a, b): - r=0 - while b: - if b&1: r^=a - a<<=1 - if a>255: a^=0x11B - b>>=1 - return r -def _mix(n, vec): - return sum(_gmul(n,v)<<(24-8*shift) for shift,v in enumerate(vec)) -def _ror32(n): - return (n&255)<<24|n>>8 -def _rcon(): - return [_gmul(1, 1<i',key[i:i+4])[0]for i in xrange(0,len(key),4)];rconpointer=0;t=KC - for i in xrange(0,KC): - self._Ke[i//4][i%4]=tk[i];self._Kd[rds-(i//4)][i%4]=tk[i] - while t < rnd_kc: - tt=tk[KC-1];tk[0]^=((self.S[(tt>>16)&255]<<24)^(self.S[(tt>>8)&255]<<16)^(self.S[tt&255]<<8)^self.S[(tt>>24)&255]^(self.rcon[rconpointer]<<24));rconpointer+=1 - if KC!=8: - for i in xrange(1,KC): - tk[i]^=tk[i-1] - else: - for i in xrange(1,KC//2): - tk[i]^=tk[i-1] - tt=tk[KC//2-1];tk[KC//2]^=(self.S[tt&255]^(self.S[(tt>>8)&255]<<8)^(self.S[(tt>>16)&255]<<16)^(self.S[(tt>>24)&255]<<24)) - for i in xrange(KC//2+1,KC): - tk[i]^=tk[i-1] - j=0 - while j>24)&255]^self.U2[(tt>>16)&255]^self.U3[(tt>>8)&255]^self.U4[tt&255]) - def _encdec(self,data,K,s,S,L1,L2,L3,L4): - if len(data)!=16: - raise ValueError('wrong block length') - rds=len(K)-1;(s1,s2,s3)=s;a=[0,0,0,0];t=[(_cw(data[4*i:4*i+4])^K[0][i])for i in xrange(0,4)] - for r in xrange(1,rds): - for i in xrange(0,4): - a[i]=(L1[(t[i]>>24)&255]^L2[(t[(i+s1)%4]>>16)&255]^L3[(t[(i+s2)%4]>>8)&255]^L4[t[(i+s3)%4]&255]^K[r][i]) - t=copy.copy(a) - rst=[] - for i in xrange(0,4): - tt=K[rds][i];rst.append((S[(t[i]>>24)&255]^(tt>>24))&255);rst.append((S[(t[(i+s1)%4]>>16)&255]^(tt>>16))&255);rst.append((S[(t[(i+s2)%4]>>8)&255]^(tt>>8))&255);rst.append((S[t[(i+s3)%4]&255]^tt)&255) - return rst - def enc_in(self,pt): - return self._encdec(pt,self._Ke,[1,2,3],self.S,self.T1,self.T2,self.T3,self.T4) - def dec_in(self,ct): - return self._encdec(ct,self._Kd,[3,2,1],self.Si,self.T5,self.T6,self.T7,self.T8) - def pad(self,pt): - c=16-(len(pt)%16) - return pt+bytes(chr(c)*c,'utf-8') - def unpad(self,pt): - c=pt[-1] - if type(c)!=int: - c=ord(c) - return pt[:-c] - def encrypt(self,iv,pt): - if len(iv)!=16: - raise ValueError('initialization vector must be 16 bytes') - else: - self._lcb=_s2b(iv) - pt=self.pad(pt) - return empty.join([self.enc_b(b)for b in chunks(pt,16)]) - def enc_b(self,pt): - if len(pt)!=16: - raise ValueError('plaintext block must be 16 bytes') - pt=_s2b(pt);pcb=[(p^l)for(p,l)in zip(pt,self._lcb)];self._lcb=self.enc_in(pcb) - return _b2s(self._lcb) - def decrypt(self,iv,ct): - if len(iv)!=16: - raise ValueError('initialization vector must be 16 bytes') - else: - self._lcb=_s2b(iv) - if len(ct)%16!=0: - raise ValueError('ciphertext must be a multiple of 16') - return self.unpad(empty.join([self.dec_b(b)for b in chunks(ct,16)])) - def dec_b(self,ct): - if len(ct)!=16: - raise ValueError('ciphertext block must be 16 bytes') - cb=_s2b(ct);pt=[(p^l)for(p,l)in zip(self.dec_in(cb),self._lcb)];self._lcb=cb - return _b2s(pt) -? + File.read(File.join(Msf::Config.data_directory, 'meterpreter', 'python', 'met_aes.py')) end end